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的主要内容,如果未能解决你的问题,请参考以下文章

1066. Root of AVL Tree (25)

1066 Root of AVL Tree (25)

PAT 1066. Root of AVL Tree

A1066. Root of AVL Tree

1066 Root of AVL Tree

PAT 甲级 1066 Root of AVL Tree