PAT.A1066 Root of AVL Tree
阿新 • • 發佈:2018-12-17
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> #include<cstdio> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<cstring> #include<stack> using namespace std; const int maxn = 110; struct node { int data,h; node* lchild; node* rchild; }; node *newnode(int v) { node *Node = new node; Node->data = v; Node->h = 1; Node->lchild = NULL; Node->rchild = NULL; return Node; } int geth(node* root) { if (root == NULL) return 0; return root->h; } int getb(node* root) { return geth(root->lchild) - geth(root->rchild); } void updateh(node* root) { root->h = max(geth(root->lchild), geth(root->rchild)) + 1; } void R(node* &root) { node* tmp = root->lchild; root->lchild = tmp->rchild; tmp->rchild = root; updateh(root); updateh(tmp); root = tmp; } void L(node* &root) { node* tmp = root->rchild; root->rchild = tmp->lchild; tmp->lchild = root; updateh(root); updateh(tmp); root = tmp; } void insert(node* &root, int v) { if (root == NULL) { root = newnode(v); return; } if (v < root->data) { insert(root->lchild, v); updateh(root); if (getb(root) == 2) { if (getb(root->lchild) == 1) { R(root); } else if (getb(root->lchild) == -1) { L(root->lchild); R(root); } } } else { insert(root->rchild, v); updateh(root); if (getb(root) == -2) { if (getb(root->rchild) == -1) { L(root); } else if (getb(root->rchild) == 1) { R(root->rchild); L(root); } } } } int main() { int n,k; scanf("%d", &n); node *root = NULL; for (int i = 0; i < n; i++) { scanf("%d", &k); insert(root, k); } printf("%d", root->data); return 0; }