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 (<=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 ythe root of the resulting AVL tree in one line.
Sample Input 1:5 88 70 61 96 120Sample Output 1:
70Sample Input 2:
7 88 70 61 96 120 90 65Sample Output 2:
88
我服了。。。我把自己写的和网上的对比了N久,基本改成一样的,也没发现哪里错了。
第一组样例就不行,提交有一组答案不对。
心态爆炸,不找了。
这题学到了一个点,AVL 的RL和LR操作可以先在子树上进行L/R再在自身上进行R/L。
#include<iostream> using namespace std; typedef struct node { int v,h; node* l; node* r; }; int H(node* root) { if(root==NULL) return -1; return root->h; } node * LL(node* root) { node* tmp=root->l; root->l=tmp->r; tmp->r=root; root->h==max(H(root->l),H(root->r))+1; tmp->h==max(H(tmp->l),H(tmp->r))+1; return tmp; } node * RR(node* root) { node* tmp=root->r; root->r=tmp->l; tmp->l=root; root->h==max(H(root->l),H(root->r))+1; tmp->h==max(H(tmp->l),H(tmp->r))+1; return tmp; } node * LR(node* root) { node* tmp=root->l; root->l=RR(tmp); return LL(root); } node * RL(node* root) { node* tmp=root->r; root->r=LL(tmp); return RR(root); } bool Isbalance(node* root) { return abs(H(root->l)-H(root->r))<2; } node* Insert(node* root,int num) { if(root==NULL) { root=new node; root->v=num; root->h=0; root->l=root->r=NULL; } else { if(num<root->v) { root->l=Insert(root->l,num); if(!Isbalance(root)) { if(num<root->l->v) root=LL(root); else root=LR(root); } } else { root->r=Insert(root->r,num); if(!Isbalance(root)) { if(num>root->r->v) root=RR(root); else root=RL(root); } } } root->h=max(H(root->l),H(root->r))+1; return root; } int main() { int n; cin>>n; node* root=NULL; for(int i=0;i<n;++i) { int num; cin>>num; root=Insert(root,num); } cout<<root->v<<endl; return 0; }