MOOC資料結構課程 題集10 Root of AVL Tree
04-樹5 Root of AVL Tree (25 分)
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.
Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.
Output Specification:
For each test case, print the root of the resulting AVL tree in one line.
Sample Input 1:
5
88 70 61 96 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88
題目要求給出一個輸入順序,要你建立一個平衡二叉搜尋樹,然後輸出根
#include <iostream> typedef struct _Tree_node { int data; int Hight; _Tree_node *Left; _Tree_node *Right; }Tree_node; Tree_node* AVL_insert_node(Tree_node * node, int X);//插入節點,調節樹高 int GetHight(Tree_node *); Tree_node *SingleLeftRotation(Tree_node *); //左單旋 Tree_node *SingleLeftRightRotation(Tree_node *); //左右雙旋 Tree_node *SingleRightRotation(Tree_node *); //右單旋 Tree_node *SingleRightLeftRotation(Tree_node *); //右左雙旋 int max(int a, int b) { return a > b ? a : b; } using namespace std; int main() { Tree_node *root = NULL; int N, X; cin >> N; for (int i = 0; i < N; i++) { cin >> X; root = AVL_insert_node(root, X); //cout << root->data << endl; } cout << root->data; return 0; } //插入節點 Tree_node* AVL_insert_node(Tree_node * node, int X) { if (node == NULL) { node = new Tree_node; node->Left = node->Right = NULL; node->Hight = 0; node->data = X; } else if (node->data < X) { node->Right = AVL_insert_node(node->Right, X); if (GetHight(node->Left) - GetHight(node->Right) == -2) { if (node->Right->data < X) node = SingleRightRotation(node); else node = SingleRightLeftRotation(node); } } else if (node->data > X) { node->Left = AVL_insert_node(node->Left, X); if (GetHight(node->Left) - GetHight(node->Right) == 2) { if (node->Left->data > X) node = SingleLeftRotation(node); else node = SingleLeftRightRotation(node); } } //每次插入要更新樹高 node->Hight = max(GetHight(node->Left), GetHight(node->Right)) + 1; return node; } //獲得樹高 int GetHight(Tree_node *node) { if (node == NULL) return 0; return max(GetHight(node->Left), GetHight(node->Right)) + 1; } //二叉樹的旋轉 Tree_node *SingleLeftRotation(Tree_node *A) { Tree_node *B = A->Left; A->Left = B->Right; B->Right = A; A->Hight = max(GetHight(A->Left), GetHight(A->Right)) + 1; B->Hight = max(GetHight(B->Left), GetHight(B->Right)) + 1; return B; } Tree_node *SingleLeftRightRotation(Tree_node *A) { A->Left = SingleRightRotation(A->Left); return SingleLeftRotation(A); } Tree_node *SingleRightRotation(Tree_node *A) { Tree_node *B = A->Right; A->Right = B->Left; B->Left = A; A->Hight = max(GetHight(A->Left), GetHight(A->Right)) + 1; B->Hight = max(GetHight(B->Left), GetHight(B->Right)) + 1; return B; } Tree_node *SingleRightLeftRotation(Tree_node *A) { A->Right = SingleLeftRotation(A->Right); return SingleRightRotation(A); }