PAT 1066. Root of AVL Tree

Posted A-Little-Nut

tags:

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

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 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:
88

#include<iostream>
using namespace std;
struct treenode{
       int data,h;
       treenode* left=NULL;
       treenode* right=NULL;
};
using tree=treenode*;
int height(tree t){
    //cout<<"height(tree t)"<<endl;
    if(!t) return 0;
    return max(height(t->left),height(t->right))+1;
}
tree RotateLL(tree t){
    //cout<<" RotateLL(tree t)"<<endl;
    tree a=t->left;
    t->left=a->right;
    a->right=t;
    a->h=max(height(a->left),height(a->right))+1;
    t->h=max(height(t->left),height(t->right))+1;
    return a; 
}
tree RotateRR(tree t){
   //cout<<"RotateRR(tree t)"<<endl;
    tree a=t->right;
    t->right=a->left;
    a->left=t;
    a->h=max(height(a->left),height(a->right))+1;
    t->h=max(height(t->left),height(t->right))+1;
    return a; 
}
tree RotateLR(tree t){
//cout<<"RotateLR(tree t)"<<endl;
    t->left=RotateRR(t->left);
    return RotateLL(t);
}
tree RotateRL(tree t){
   //cout<<"RotateRL(tree t)"<<endl;
    t->right=RotateLL(t->right);
    return RotateRR(t);
}
tree insert(tree t,int v){
//cout<<" insert(tree t,int v)"<<endl;
    if(t==NULL){
       t=new treenode();
       t->data=v; t->h=0;
       return t;
    }else if(v<t->data){
       t->left=insert(t->left,v);
       if(height(t->left)-height(t->right)==2)
       if(v<t->left->data) 
       t=RotateLL(t);
       else t=RotateLR(t); 
    }else{
       t->right=insert(t->right,v);
       if(height(t->left)-height(t->right)==-2)
       if(v>t->right->data)
       t=RotateRR(t);
       else t=RotateRL(t); 
}
    t->h=height(t);
    return t;
} 
int main(){
    int n;
    cin>>n;
    tree t=NULL;
    for(int i=0;i<n;i++){
        int v; cin>>v;
        t=insert(t,v);
    }
    cout<<t->data<<endl;
    return 0;
}

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

PAT_A1066#Root of AVL Tree

PAT 甲级 1066 Root of AVL Tree

PAT.1066 Root of AVL Tree(平衡树模板题)

PAT.1066 Root of AVL Tree(平衡树模板题)

PAT (Advanced Level) 1066. Root of AVL Tree (25)

PAT A1066 Root of AVL Tree [平衡二叉树]