logo

Troca mínima necessária para converter árvore binária em árvore de pesquisa binária

Dada uma matriz arr[] que representa um Árvore binária completa ou seja, se índice eu é o pai índice 2*eu + 1 é o filho esquerdo e índice 2*i + 2 é o filho certo. A tarefa é encontrar o mínimo número de trocas necessária para convertê-lo em um Árvore de pesquisa binária.

Exemplos:  

Entrada: arr[] = [5 6 7 8 9 10 11]
Saída: 3
Explicação:
Árvore binária do array fornecido:



Troca mínima necessária para converter árvore binária em árvore de pesquisa binária-1' title=

Troca 1: Troque o nó 8 pelo nó 5.
Troca 2: Troca o nó 9 pelo nó 10.
Troca 3: Troque o nó 10 pelo nó 7.

Portanto, são necessárias no mínimo 3 swaps para obter a árvore de pesquisa binária abaixo:

SQL de ordem aleatória
Troca mínima necessária para converter árvore binária em árvore de pesquisa binária-3' loading='lazy' title=


Entrada: arr[] = [1 2 3]
Saída: 1
Explicação:
Árvore binária do array fornecido:

algoritmos de pesquisa
Troca mínima necessária para converter árvore binária em árvore de pesquisa binária-2' loading='lazy' title=

Após trocar o nó 1 pelo nó 2, obtenha a árvore de pesquisa binária abaixo:

Troca mínima necessária para converter árvore binária em árvore de pesquisa binária-4' loading='lazy' title=

Abordagem:

A idéia é usar o fato de que travessia em ordem de Árvore de pesquisa binária está em aumentando ordem do seu valor. 
Então encontre o travessia em ordem da Árvore Binária e armazene-o no array e tente organizar a matriz. O número mínimo de trocas necessárias para classificar o array será a resposta.

C++
// C++ program for Minimum swap required // to convert binary tree to binary search tree #include   using namespace std; // Function to perform inorder traversal of the binary tree // and store it in vector v void inorder(vector<int>& arr vector<int>& inorderArr int index) {    int n = arr.size();    // If index is out of bounds return  if (index >= n)  return;  // Recursively visit left subtree  inorder(arr inorderArr 2 * index + 1);    // Store current node value in vector  inorderArr.push_back(arr[index]);    // Recursively visit right subtree  inorder(arr inorderArr 2 * index + 2); } // Function to calculate minimum swaps  // to sort inorder traversal int minSwaps(vector<int>& arr) {  int n = arr.size();  vector<int> inorderArr;    // Get the inorder traversal of the binary tree  inorder(arr inorderArr 0);    // Create an array of pairs to store value  // and original index  vector<pair<int int>> t(inorderArr.size());  int ans = 0;    // Store the value and its index  for (int i = 0; i < inorderArr.size(); i++)  t[i] = {inorderArr[i] i};    // Sort the pair array based on values   // to get BST order  sort(t.begin() t.end());    // Find minimum swaps by detecting cycles  for (int i = 0; i < t.size(); i++) {    // If the element is already in the   // correct position continue  if (i == t[i].second)  continue;    // Otherwise perform swaps until the element  // is in the right place  else {    // Swap elements to correct positions  swap(t[i].first t[t[i].second].first);  swap(t[i].second t[t[i].second].second);  }    // Check if the element is still not  // in the correct position  if (i != t[i].second)  --i;     // Increment swap count  ans++;  }    return ans; } int main() {    vector<int> arr = { 5 6 7 8 9 10 11 };  cout << minSwaps(arr) << endl; } 
Java
// Java program for Minimum swap required // to convert binary tree to binary search tree import java.util.Arrays; class GfG {    // Function to perform inorder traversal of the binary tree  // and store it in an array  static void inorder(int[] arr int[] inorderArr   int index int[] counter) {  int n = arr.length;    // Base case: if index is out of bounds return  if (index >= n)  return;    // Recursively visit left subtree  inorder(arr inorderArr 2 * index + 1 counter);    // Store current node value in the inorder array  inorderArr[counter[0]] = arr[index];  counter[0]++;    // Recursively visit right subtree  inorder(arr inorderArr 2 * index + 2 counter);  }  // Function to calculate minimum swaps   // to sort inorder traversal  static int minSwaps(int[] arr) {  int n = arr.length;  int[] inorderArr = new int[n];  int[] counter = new int[1];    // Get the inorder traversal of the binary tree  inorder(arr inorderArr 0 counter);    // Create an array of pairs to store the value   // and its original index  int[][] t = new int[n][2];  int ans = 0;    // Store the value and its original index  for (int i = 0; i < n; i++) {  t[i][0] = inorderArr[i];  t[i][1] = i;  }    // Sort the array based on values to get BST order  Arrays.sort(t (a b) -> Integer.compare(a[0] b[0]));    // Find minimum swaps by detecting cycles  boolean[] visited = new boolean[n];    // Iterate through the array to find cycles  for (int i = 0; i < n; i++) {    // If the element is already visited or in  // the correct place continue  if (visited[i] || t[i][1] == i)  continue;    // Start a cycle and find the number of  // nodes in the cycle  int cycleSize = 0;  int j = i;    while (!visited[j]) {  visited[j] = true;  j = t[j][1];  cycleSize++;  }    // If there is a cycle we need (cycleSize - 1)  // swaps to sort the cycle  if (cycleSize > 1) {  ans += (cycleSize - 1);  }  }    // Return the total number of swaps  return ans;  }  public static void main(String[] args) {  int[] arr = {5 6 7 8 9 10 11};   System.out.println(minSwaps(arr));  } } 
Python
# Python program for Minimum swap required # to convert binary tree to binary search tree # Function to perform inorder traversal of the binary tree # and store it in an array def inorder(arr inorderArr index): # If index is out of bounds return n = len(arr) if index >= n: return # Recursively visit left subtree inorder(arr inorderArr 2 * index + 1) # Store current node value in inorderArr inorderArr.append(arr[index]) # Recursively visit right subtree inorder(arr inorderArr 2 * index + 2) # Function to calculate minimum swaps  # to sort inorder traversal def minSwaps(arr): inorderArr = [] # Get the inorder traversal of the binary tree inorder(arr inorderArr 0) # Create a list of pairs to store value and original index t = [(inorderArr[i] i) for i in range(len(inorderArr))] ans = 0 # Sort the list of pairs based on values # to get BST order t.sort() # Initialize visited array visited = [False] * len(t) # Find minimum swaps by detecting cycles for i in range(len(t)): # If already visited or already in the # correct place skip if visited[i] or t[i][1] == i: continue # Start a cycle and find the number of  # nodes in the cycle cycleSize = 0 j = i # Process all elements in the cycle while not visited[j]: visited[j] = True j = t[j][1] cycleSize += 1 # If there is a cycle of size `cycle_size` we  # need `cycle_size - 1` swaps if cycleSize > 1: ans += (cycleSize - 1) # Return total number of swaps return ans if __name__ == '__main__': arr = [5 6 7 8 9 10 11] print(minSwaps(arr)) 
C#
// C# program for Minimum swap required // to convert binary tree to binary search tree using System; using System.Linq; class GfG {    // Function to perform inorder traversal of the binary tree  // and store it in an array  static void Inorder(int[] arr int[] inorderArr int index ref int counter) {  int n = arr.Length;  // Base case: if index is out of bounds return  if (index >= n)  return;  // Recursively visit left subtree  Inorder(arr inorderArr 2 * index + 1 ref counter);  // Store current node value in inorderArr  inorderArr[counter] = arr[index];  counter++;  // Recursively visit right subtree  Inorder(arr inorderArr 2 * index + 2 ref counter);  }  // Function to calculate minimum  // swaps to sort inorder traversal  static int MinSwaps(int[] arr) {  int n = arr.Length;  int[] inorderArr = new int[n];  int counter = 0;  // Get the inorder traversal of the binary tree  Inorder(arr inorderArr 0 ref counter);  // Create an array of pairs to store value   // and original index  var t = new (int int)[n];  for (int i = 0; i < n; i++) {  t[i] = (inorderArr[i] i);  }  // Sort the array based on values to get BST order  Array.Sort(t (a b) => a.Item1.CompareTo(b.Item1));  // Initialize visited array  bool[] visited = new bool[n];  int ans = 0;  // Find minimum swaps by detecting cycles  for (int i = 0; i < n; i++) {    // If already visited or already in   // the correct place skip  if (visited[i] || t[i].Item2 == i)  continue;  // Start a cycle and find the number   // of nodes in the cycle  int cycleSize = 0;  int j = i;  // Process all elements in the cycle  while (!visited[j]) {  visited[j] = true;  j = t[j].Item2;  cycleSize++;  }  // If there is a cycle of size `cycle_size` we  // need `cycle_size - 1` swaps  if (cycleSize > 1)  {  ans += (cycleSize - 1);  }  }  // Return total number of swaps  return ans;  }  static void Main(string[] args) {    int[] arr = { 5 6 7 8 9 10 11 };  Console.WriteLine(MinSwaps(arr));  } } 
JavaScript
// Javascript program for Minimum swap required // to convert binary tree to binary search tree // Inorder traversal to get values in sorted order function inorder(arr inorderArr index) {  // If index is out of bounds return  if (index >= arr.length)  return;  // Recursively visit left subtree  inorder(arr inorderArr 2 * index + 1);  // Store current node value in array  inorderArr.push(arr[index]);  // Recursively visit right subtree  inorder(arr inorderArr 2 * index + 2); } // Function to calculate minimum swaps to sort inorder // traversal function minSwaps(arr) {  let inorderArr = [];  // Get the inorder traversal of the binary tree  inorder(arr inorderArr 0);  // Create an array of pairs to store value and original  // index  let t = inorderArr.map((val i) => [val i]);  let ans = 0;  // Sort the pair array based on values to get BST order  t.sort((a b) => a[0] - b[0]);  // Find minimum swaps by detecting cycles  let visited = Array(arr.length)  .fill(false);  for (let i = 0; i < t.length; i++) {    // If the element is already in the correct  // position continue  if (visited[i] || t[i][1] === i)  continue;  // Otherwise perform swaps until the element is in  // the right place  let cycleSize = 0;  let j = i;  while (!visited[j]) {  visited[j] = true;  j = t[j][1];  cycleSize++;  }  // If there is a cycle we need (cycleSize - 1)  // swaps to sort the cycle  if (cycleSize > 1) {  ans += (cycleSize - 1);  }  }  // Return total number of swaps  return ans; } let arr = [ 5 6 7 8 9 10 11 ]; console.log(minSwaps(arr)); 

Saída
3 

Complexidade de tempo: O(n*logn) onde n é o número de elementos na matriz.
Espaço Auxiliar: O(n) porque está usando espaço extra para array 

Exercício: Podemos estender isso para uma árvore binária normal, ou seja, uma árvore binária representada por ponteiros esquerdo e direito e não necessariamente completa?

Criar questionário