배열이 주어지면 도착[] 이는 완전한 이진 트리 즉 만약 인덱스 나 은 조상 색인 2*나는 + 1 은 왼쪽 아이 그리고 인덱스 2*i + 2 ~이다 맞는 아이. 임무는 다음을 찾는 것입니다. 최저한의 수 교환 로 변환하는 데 필요합니다. 이진 검색 트리.
예:
입력: arr[] = [5 6 7 8 9 10 11]
산출: 3
설명:
주어진 배열의 이진 트리:![]()
교환 1: 노드 8을 노드 5와 교환합니다.
스왑 2: 노드 9를 노드 10으로 바꿉니다.
교환 3: 노드 10을 노드 7로 교환합니다.따라서 아래 이진 검색 트리를 얻으려면 최소 3번의 스왑이 필요합니다.
람다 함수 자바![]()
입력: arr[] = [1 2 3]
산출: 1
설명:
주어진 배열의 이진 트리:![]()
노드 1을 노드 2로 바꾼 후 아래 이진 검색 트리를 얻습니다.
![]()
접근하다:
for 루프 bash
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));
산출
3
시간 복잡도: O(n*logn) 여기서 N 배열의 요소 수입니다.
보조 공간: O(n)은 배열에 추가 공간을 사용하기 때문입니다.
운동: 이것을 일반 이진 트리, 즉 왼쪽 및 오른쪽 포인터를 사용하여 표현되고 반드시 완전하지는 않은 이진 트리로 확장할 수 있습니까?
퀴즈 만들기