PAT_A1066#Root of AVL Tree

Posted blue-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT_A1066#Root of AVL Tree相关的知识,希望对你有一定的参考价值。

Source:

PAT A1066 Root of AVL Tree (25 分)

Description:

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 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

Keys:

Code:

  1 /*
  2 Data: 2019-06-24 15:44:17
  3 Problem: PAT_A1066#Root of AVL Tree
  4 AC: 12:20
  5 
  6 题目大意:
  7 构造AVL树,打印根结点
  8 */
  9 #include<cstdio>
 10 #include<algorithm>
 11 using namespace std;
 12 struct node
 13 
 14     int data,height;
 15     node *lchild,*rchild;
 16 ;
 17 
 18 int GetHeight(node *root)
 19 
 20     if(root == NULL)
 21         return 0;
 22     else
 23         return root->height;
 24 
 25 
 26 void UpdataHeight(node *&root)
 27 
 28     root->height = max(GetHeight(root->lchild),GetHeight(root->rchild))+1;
 29 
 30 
 31 int GetBalanceFactor(node *root)
 32 
 33     return GetHeight(root->lchild) - GetHeight(root->rchild);
 34 
 35 
 36 void LeftRotation(node *&root)
 37 
 38     node *temp = root->rchild;
 39     root->rchild = temp->lchild;
 40     temp->lchild = root;
 41     UpdataHeight(root);
 42     UpdataHeight(temp);
 43     root = temp;
 44 
 45 
 46 void RightRotation(node *&root)
 47 
 48     node *temp = root->lchild;
 49     root->lchild = temp->rchild;
 50     temp->rchild = root;
 51     UpdataHeight(root);
 52     UpdataHeight(temp);
 53     root = temp;
 54 
 55 
 56 void Insert(node *&root, int x)
 57 
 58     if(root == NULL)
 59     
 60         root = new node;
 61         root->data = x;
 62         root->height=1;
 63         root->lchild = root->rchild = NULL;
 64     
 65     else if(x < root->data)
 66     
 67         Insert(root->lchild, x);
 68         UpdataHeight(root);
 69         if(GetBalanceFactor(root) == 2)
 70         
 71             if(GetBalanceFactor(root->lchild) == 1)
 72                 RightRotation(root);
 73             else
 74             
 75                 LeftRotation(root->lchild);
 76                 RightRotation(root);
 77             
 78         
 79     
 80     else
 81     
 82         Insert(root->rchild, x);
 83         UpdataHeight(root);
 84         if(GetBalanceFactor(root) == -2)
 85         
 86             if(GetBalanceFactor(root->rchild) == -1)
 87                 LeftRotation(root);
 88             else
 89             
 90                 RightRotation(root->rchild);
 91                 LeftRotation(root);
 92             
 93         
 94     
 95 
 96 
 97 int main()
 98 
 99 #ifdef ONLINE_JUDGE
100 #else
101     freopen("Test.txt", "r", stdin);
102 #endif // ONLINE_JUDGE
103 
104     int n,x;
105     scanf("%d", &n);
106     node *root = NULL;
107     for(int i=0; i<n; i++)
108     
109         scanf("%d", &x);
110         Insert(root, x);
111     
112     printf("%d", root->data);
113 
114     return 0;
115 

 

以上是关于PAT_A1066#Root of AVL Tree的主要内容,如果未能解决你的问题,请参考以下文章