题目
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.
![](http://pat.zju.edu.cn/upload/79_mtxjq1kj3gx.jpg)
![](http://pat.zju.edu.cn/upload/79_mtxjqnwja2o.jpg)
![](http://pat.zju.edu.cn/upload/79_mtxjr4gyzdg.jpg)
![](http://pat.zju.edu.cn/upload/79_mtxjrh51o9y.jpg)
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>
#include <cstdio>
#include <algorithm>
using namespace std;
struct node //树中的点
{
node *left;
node *right;
int val; //值
int height; //高度,从0开始计数
node(int v=0,node *l=NULL,node *r=NULL,int h=0):val(v),left(l),right(r),height(h){};
};
int Get_height(node *n); //返回高度,可以处理NULL
bool Is_balance(node *l,node *r); //是否平衡
node* insert(node *root,int val); //将val插入以root为根的平衡树中
node* Rotleft(node *root); //左转
node* Rotright(node *root); //右转
int main()
{
int n;
cin>>n;
int i,temp;
node *root=NULL;
for(i=0;i<n;i++)
{
scanf("%d",&temp);
root=insert(root,temp);
}
cout<<root->val;
return 0;
}
int Get_height(node *n)
{
if(n==NULL)
return -1;
else
return n->height;
}
bool Is_balance(node *l,node *r)
{
return abs(Get_height(l)-Get_height(r))<2;
}
node* insert(node *root,int val) //递归调用,直到获得NULL,即插入位置
{
if(root==NULL)
{
root=new node(val);
return root;
}
if(val<root->val) //比值小,插入到左子树中
{
root->left=insert(root->left,val);
if(!Is_balance(root->left,root->right)) //保持平衡性
{
if(val<root->left->val) //插入在左子树的左子树
root=Rotright(root);
else //插入在左子树的右子树
{
root->left=Rotleft(root->left);
root=Rotright(root);
}
}
}
else //比值大,插入到右子树中
{
root->right=insert(root->right,val);
if(!Is_balance(root->left,root->right)) //保持平衡性
{
if(val>root->right->val) //插入在右子树的右子树
root=Rotleft(root);
else //插入在右子树的左子树
{
root->right=Rotright(root->right);
root=Rotleft(root);
}
}
}
root->height=max(Get_height(root->left),Get_height(root->right))+1;
return root;
}
node* Rotleft(node *root) //节点左转
{
node *t=root->right;
root->right=t->left;
t->left=root;
root->height=max(Get_height(root->left),Get_height(root->right))+1;
t->height=max(Get_height(t->left),Get_height(t->right))+1;
return t;
}
node* Rotright(node *root) //节点右转
{
node *t=root->left;
root->left=t->right;
t->right=root;
root->height=max(Get_height(root->left),Get_height(root->right))+1;
t->height=max(Get_height(t->left),Get_height(t->right))+1;
return t;
}