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
AVL树:任何节点的两个子子树的高度最多相差一个
做题思路:
- insert表示插入建树的过程,如果root为空,直接新建结点插入
- 如果当前要插入的值<root->val,则插入root的左子树;反之则插入root的右子树
- 如果插入后getHeight左右子树高度差==2,若<,<则向右转;<,>先向左旋后向右旋;>,>向左旋;>,<先向右旋后向左旋
- rotateLeft表示向左旋,rotateRight表示向右旋
- rotateLeftRight表示先向左旋后向右旋,rotateRightLeft表示先向右旋后向左旋
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node {
int val;
node *left,*right;
};
int getHeight(node* r){
if(r==NULL) return 0;
return max(getHeight(r->left),getHeight(r->right))+1;
}
node* rotateLeft(node* r){
node* t=r->right;
r->right=t->left;
t->left=r;
return t;
}
node* rotateRight(node* r){
node* t=r->left;
r->left=t->right;
t->right=r;
return t;
}
node* rotateLeftRight(node* r){
r->left=rotateLeft(r->left);
r=rotateRight(r);
return r;
}
node* rotateRightLeft(node* r){
r->right=rotateRight(r->right);
r=rotateLeft(r);
return r;
}
node* insert(node* r,int x){
if(r==NULL){
node* r=(struct node*)malloc(sizeof(struct node));
r->val=x;
r->left=r->right=NULL;
return r;
}
if(x<r->val){
r->left=insert(r->left,x);
if(getHeight(r->left)-getHeight(r->right)==2)
r=(x<r->left->val)?rotateRight(r):rotateLeftRight(r);
}
else{
r->right=insert(r->right,x);
if(getHeight(r->right)-getHeight(r->left)==2)
r=(x>r->right->val)?rotateLeft(r):rotateRightLeft(r);
}
return r;
}
int main() {
int n,x;
cin>>n;
node* r=NULL;
for(int i=0; i<n; i++) {
cin>>x;
r=insert(r,x);
}
cout<<r->val<<endl;
return 0;
}