04-树5 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 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
题目要求给出一个输入顺序,要你建立一个平衡二叉搜索树,然后输出根
#include <iostream>
typedef struct _Tree_node
{
int data;
int Hight;
_Tree_node *Left;
_Tree_node *Right;
}Tree_node;
Tree_node* AVL_insert_node(Tree_node * node, int X);//插入节点,调节树高
int GetHight(Tree_node *);
Tree_node *SingleLeftRotation(Tree_node *); //左单旋
Tree_node *SingleLeftRightRotation(Tree_node *); //左右双旋
Tree_node *SingleRightRotation(Tree_node *); //右单旋
Tree_node *SingleRightLeftRotation(Tree_node *); //右左双旋
int max(int a, int b)
{
return a > b ? a : b;
}
using namespace std;
int main()
{
Tree_node *root = NULL;
int N, X;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> X;
root = AVL_insert_node(root, X);
//cout << root->data << endl;
}
cout << root->data;
return 0;
}
//插入节点
Tree_node* AVL_insert_node(Tree_node * node, int X)
{
if (node == NULL)
{
node = new Tree_node;
node->Left = node->Right = NULL;
node->Hight = 0;
node->data = X;
}
else if (node->data < X)
{
node->Right = AVL_insert_node(node->Right, X);
if (GetHight(node->Left) - GetHight(node->Right) == -2)
{
if (node->Right->data < X)
node = SingleRightRotation(node);
else
node = SingleRightLeftRotation(node);
}
}
else if (node->data > X)
{
node->Left = AVL_insert_node(node->Left, X);
if (GetHight(node->Left) - GetHight(node->Right) == 2)
{
if (node->Left->data > X)
node = SingleLeftRotation(node);
else
node = SingleLeftRightRotation(node);
}
}
//每次插入要更新树高
node->Hight = max(GetHight(node->Left), GetHight(node->Right)) + 1;
return node;
}
//获得树高
int GetHight(Tree_node *node)
{
if (node == NULL)
return 0;
return max(GetHight(node->Left), GetHight(node->Right)) + 1;
}
//二叉树的旋转
Tree_node *SingleLeftRotation(Tree_node *A)
{
Tree_node *B = A->Left;
A->Left = B->Right;
B->Right = A;
A->Hight = max(GetHight(A->Left), GetHight(A->Right)) + 1;
B->Hight = max(GetHight(B->Left), GetHight(B->Right)) + 1;
return B;
}
Tree_node *SingleLeftRightRotation(Tree_node *A)
{
A->Left = SingleRightRotation(A->Left);
return SingleLeftRotation(A);
}
Tree_node *SingleRightRotation(Tree_node *A)
{
Tree_node *B = A->Right;
A->Right = B->Left;
B->Left = A;
A->Hight = max(GetHight(A->Left), GetHight(A->Right)) + 1;
B->Hight = max(GetHight(B->Left), GetHight(B->Right)) + 1;
return B;
}
Tree_node *SingleRightLeftRotation(Tree_node *A)
{
A->Right = SingleLeftRotation(A->Right);
return SingleRightRotation(A);
}