1066 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 (≤) which is the total number of keys to be inserted. Then Ndistinct 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
 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 struct Node{
 5      int v,height;
 6      Node* lchild,*rchild;
 7 }*root;
 8 
 9 Node* newNode(int v){
10     Node* node = new Node;
11     node -> v = v;
12     node -> lchild = node -> rchild = NULL;
13     node -> height = 1;
14     return node;
15 }
16 
17 int getHeight(Node* root){
18     if(root == NULL) return 0;
19     return root -> height;
20 }
21 
22 void updateHeight(Node* root){
23      root -> height = max(getHeight(root -> lchild),getHeight(root -> rchild))+1;
24 } 
25 
26 int getBalanceFactor(Node* root){
27     return getHeight(root -> lchild) - getHeight(root -> rchild);
28 }
29 
30 void R(Node* &root){
31     Node* temp =  root -> lchild;
32     root -> lchild = temp -> rchild;
33     temp -> rchild = root;
34     updateHeight(root);
35     updateHeight(temp);
36     root = temp;
37 }
38 void L(Node* &root){
39     Node* temp = root -> rchild;
40     root -> rchild = temp -> lchild;
41     temp -> lchild = root;
42     updateHeight(root);  //先更新root(子树)的高度
43     updateHeight(temp);
44     root = temp;
45 }
46 
47 void insert(Node* &root, int v){
48     if(root == NULL){
49         root = newNode(v);
50         return;
51     }
52     if(v < root -> v){
53         insert(root -> lchild,v);
54         updateHeight(root);
55         if(getBalanceFactor(root) == 2){
56             if(getBalanceFactor(root -> lchild) == 1){
57                 R(root);
58             }else if(getBalanceFactor(root -> lchild) == -1){
59                 L(root -> lchild);
60                 R(root);
61             }
62         }
63     }else{
64         insert(root -> rchild,v);
65         updateHeight(root);
66         if(getBalanceFactor(root) == -2){
67             if(getBalanceFactor(root -> rchild) == -1){
68                 L(root);
69             }else if(getBalanceFactor(root -> rchild) == 1){
70                 R(root -> rchild);
71                 L(root);
72                 
73             }
74         }
75     }
76 }
77 
78 int main(){
79     int n,v;
80     scanf("%d",&n);
81     for(int i = 0; i < n; i++){
82         scanf("%d",&v);
83         insert(root,v);
84     }
85     printf("%d",root -> v);
86     return 0;
87 }


原文地址:https://www.cnblogs.com/wanghao-boke/p/9311065.html