04-树3. 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
输出平衡二叉树的根节点,难点是二叉树的旋转处理。网查大侠方法,然后就慢慢悟了。。。
#include<iostream>
using namespace std;
struct AVLTreeNode{
int Data;
AVLTreeNode *Left;
AVLTreeNode *Right;
int Height;
};
int GetHeight(AVLTreeNode *tree) // 获取树高
{
if(tree == NULL)
return -1;
else
return tree->Height;
}
int Max(int a,int b)
{
return (a>b)?a:b;
}
AVLTreeNode *SingleLeftRotation(AVLTreeNode *A) //单向左旋
{
AVLTreeNode *B=A->Left;
A->Left=B->Right;
B->Right=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),A->Height)+1;
return B;
}
AVLTreeNode *SingleRightRotation(AVLTreeNode *A) //单向右旋
{
AVLTreeNode *B=A->Right;
A->Right=B->Left;
B->Left=A;
A->Height=Max(GetHeight(A->Left),GetHeight(A->Right))+1;
B->Height=Max(GetHeight(B->Left),A->Height)+1;
return B;
}
AVLTreeNode *DoubleLeftRightRotation(AVLTreeNode *A) //左右双旋
{
A->Left=SingleRightRotation(A->Left);
return SingleLeftRotation(A);
}
AVLTreeNode *DoubleRightLeftRotation(AVLTreeNode *A) //右左双旋
{
A->Right=SingleLeftRotation(A->Right);
return SingleRightRotation(A);
}
AVLTreeNode *AVL_Insertion ( int X, AVLTreeNode *T ) //将元素插入AVL树中并做旋转处理
{
if ( !T )
{
T = new AVLTreeNode;
T->Data = X;
T->Height = 0;
T->Left = T->Right = NULL;
}
else if (X < T->Data)
{
T->Left = AVL_Insertion(X, T->Left);
if (GetHeight(T->Left) - GetHeight(T->Right) == 2 )
if (X < T->Left->Data)
T = SingleLeftRotation(T);
else
T = DoubleLeftRightRotation(T);
}
else if (X > T->Data)
{
T->Right = AVL_Insertion(X, T->Right);
if (GetHeight(T->Left) - GetHeight(T->Right) == -2 )
if (X > T->Right->Data)
T = SingleRightRotation(T);
else
T = DoubleRightLeftRotation(T);
}
T->Height = Max(GetHeight(T->Left),GetHeight(T->Right))+1;
return T;
}
int main()
{
int i,n,TestNum;
AVLTreeNode *root =NULL;
cin>>TestNum;
for(i=0;i<TestNum;i++){
cin>>n;
root = AVL_Insertion(n,root);
}
cout<<root->Data;
return 0;
}