Computer >> Máy Tính >  >> Lập trình >> C ++

Chuyển đổi cây nhị phân sang cây tìm kiếm nhị phân bằng cách sử dụng bộ STL C ++?

Trong trường hợp Cây nhị phân nhất định, hãy chuyển đổi nó thành Cây tìm kiếm nhị phân theo cách giữ nguyên cấu trúc ban đầu của Cây nhị phân.

Bộ C ++ STL sẽ được sử dụng bởi giải pháp này thay vì giải pháp dựa trên mảng.

Ví dụ

Ví dụ 1

Đầu vào

     11
    /  \
   3    8
/     \
9 5

Đầu ra

     9
   /   \
  5     11
 /        \
3        8

Ví dụ 2

Đầu vào

      11
     /   \
    31    16
   /        \
 21         6

Đầu ra

     16
    /   \
  11     21
 /         \
 6          31

Giải pháp

  • Chúng ta phải sao chép các mục của cây nhị phân trong một tập hợp trong khi thực hiện chuyển ngang inorder. Điều này tiêu tốn O (n log n) thời gian. Lưu ý rằng bộ trong C ++ STL (Thư viện mẫu chuẩn) được triển khai bằng Cây tìm kiếm nhị phân tự cân bằng như Cây màu đen đỏ, Cây AVL, v.v.

  • Không cần sắp xếp tập hợp vì các tập hợp trong C ++ được sử dụng để triển khai cây tìm kiếm nhị phân Tự cân bằng do mỗi thao tác như chèn, tìm kiếm, xóa, v.v. tiêu tốn O (log n) thời gian.

  • Bây giờ, chúng ta có thể dễ dàng sao chép các phần tử của tập hợp lần lượt từ đầu đến cây trong khi thực hiện chuyển ngang qua cây nhỏ hơn. Cần cẩn thận vì khi sao chép từng mục của tập hợp từ đầu, trước tiên chúng tôi sao chép nó vào cây trong khi thực hiện duyệt qua trình đơn vị, sau đó cũng xóa nó khỏi tập hợp.

  • Hiện tại, giải pháp được đề cập ở trên đơn giản và dễ thực hiện hơn so với việc chuyển đổi dựa trên mảng của cây nhị phân thành cây tìm kiếm nhị phân được giải thích tại đây.

Chương trình sau để chuyển đổi cây nhị phân sang cây tìm kiếm nhị phân (BST) bằng cách sử dụng set, được giải thích ở đây.

Ví dụ

/* CPP program for converting a Binary tree to BST implementing sets as containers. */
#include <bits/stdc++.h>
using namespace std;
struct Node1 {
   int data;
   struct Node1 *left, *right;
};
// function for storing the nodes in set while performing inorder traversal.
void storeinorderInSet(Node1* root1, set<int>& s){
   if (!root1)
   return;
   // Left subtree is visited first
   storeinorderInSet(root1->left, s);
   Order of O(logn) for sets is taken by insertion
   s.insert(root1->data);
   // We visit the right subtree
   storeinorderInSet(root1->right, s);
} // Time complexity = O(nlogn)
// function for copying elements of set one by one to the tree while performing inorder traversal
void setToBST(set<int>& s, Node1* root1){
   // base condition
   if (!root1) return;
   // We first move to the left subtree and update elements
   setToBST(s, root1->left);
   // iterator initially pointing to the starting of set
   auto it = s.begin();
   // We copy the element at sarting of set(sorted) to the tree.
   root1->data = *it;
   // now we erase the starting element from set.
   s.erase(it);
   // now we move to right subtree and update elements
   setToBST(s, root1->right);
}
// T(n) = O(nlogn) time
// We convert Binary tree to BST.
void binaryTreeToBST(Node1* root1){
   set<int> s;
   // We populate the set with the tree's inorder traversal data
   storeinorderInSet(root1, s);
   // At present sets are by default sorted as they are used
   implementing self-balancing BST
   // We copy elements from set to the tree while inorder traversal
   which makes a BST
   setToBST(s, root1);
}
// Time complexity = O(nlogn),
// Auxiliary Space = O(n) for set.
// helper function for creating a node
Node1* newNode(int data){
   // dynamically allocating memory
   Node1* temp = new Node1();
   temp->data = data;
   temp->left = temp->right = NULL;
   return temp;
}
// function for doing inorder traversal
void inorder(Node1* root1){
   if (!root1)
   return;
   inorder(root1->left);
   cout<< root1->data << " ";
   inorder(root1->right);
}
int main(){
   Node1* root1 = newNode(6);
   root1->left = newNode(8);
   root1->right = newNode(10);
   root1->right->left = newNode(11);
   root1->left->left = newNode(2);
   root1->left->right = newNode(7);
   root1->right->right = newNode(12);
   /* Building tree given in the following figure
      6
      / \
      8 10
      /\ / \
      2 7 11 12 */
   // We convert the above Binary tree to BST
   binaryTreeToBST(root1);
   cout<< "Inorder traversal of BST is: " << endl;
   inorder(root1);
   return 0;
}

Đầu ra

Inorder traversal of BST is:
1 5 6 7 9 10 11

Độ phức tạp về thời gian được biểu thị là:O (n Log n)

Không gian Phụ trợ được ký hiệu là:(n)