Trong hướng dẫn này, chúng ta sẽ thảo luận về một chương trình chuyển đổi cây tìm kiếm nhị phân bình thường sang cây tìm kiếm nhị phân cân bằng.
Đối với điều này, chúng tôi sẽ được cung cấp một cây tìm kiếm nhị phân lệch trái hoặc phải. Nhiệm vụ của chúng tôi là chuyển đổi nó thành một cây tìm kiếm nhị phân cân bằng tuân theo một bộ quy tắc nhất định.
Ví dụ
#include <bits/stdc++.h> using namespace std; //node structure of tree struct Node{ int data; Node* left, *right; }; //traversing tree and storing node pointers //in vector nodes void store_nodes(Node* root, vector<Node*> &nodes){ if (root==NULL) return; store_nodes(root->left, nodes); nodes.push_back(root); store_nodes(root->right, nodes); } //constructing binary tree Node* construct_tree(vector<Node*> &nodes, int start, int end){ if (start > end) return NULL; //make the middle element to be the root int mid = (start + end)/2; Node *root = nodes[mid]; root->left = construct_tree(nodes, start, mid-1); root->right = construct_tree(nodes, mid+1, end); return root; } //converting an unbalanced BST to a balanced BST Node* buildTree(Node* root){ //storing nodes of given BST in sorted order vector<Node *> nodes; store_nodes(root, nodes); int n = nodes.size(); return construct_tree(nodes, 0, n-1); } //creation of new node Node* newNode(int data){ Node* node = new Node; node->data = data; node->left = node->right = NULL; return (node); } //performing preorder traversal void preOrder(Node* node){ if (node == NULL) return; printf("%d ", node->data); preOrder(node->left); preOrder(node->right); } int main(){ Node* root = newNode(10); root->left = newNode(8); root->left->left = newNode(7); root->left->left->left = newNode(6); root->left->left->left->left = newNode(5); root = buildTree(root); printf("Preorder traversal of balanced BST : \n"); preOrder(root); return 0; }
Đầu ra
Preorder traversal of balanced BST : 7 5 6 8 10