04-树5 Root of AVL Tree (25 分)(C++)
#题目
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.
F1.jpg
F2.jpg
F3.jpg
F4.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 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
#C++代码
#include<iostream>
using namespace std;
typedef struct Node Node;
struct Node
{
int Data;
int height;
Node* L;
Node* R;
};
int Get_Height(Node* T)
{
if (!T)
return -1;
else
return T->height;
}
int max(int a, int b)
{
return (a > b) ? a : b;
}
Node* LLRotation(Node* T)
{
Node* temp = T->L;
T->L = T->L->R;
temp->R = T;
T->height = max(Get_Height(T->L), Get_Height(T -> R)) + 1;
temp->height = max(Get_Height(temp->L), Get_Height(temp->R)) + 1;
return temp;
}
Node* RRRotation(Node* T)
{
Node* temp = T->R;
T->R = T->R->L;
temp->L = T;
T->height = max(Get_Height(T->L), Get_Height(T->R)) + 1;
temp->height = max(Get_Height(temp->L), Get_Height(temp->R)) + 1;
return temp;
}
Node* LRRotation(Node* A)
{
Node* B = A->L;
Node* C = A->L->R;
B->R = C->L;
A->L = C->R;
C->L = B;
C->R = A;
A->height = max(Get_Height(A->L), Get_Height(A->R)) + 1;
B->height = max(Get_Height(B->L), Get_Height(B->R)) + 1;
C->height = max(Get_Height(C->L), Get_Height(C->R)) + 1;
return C;
}
Node* RLRotation(Node* A)
{
Node* B = A->R;
Node* C = A->R->L;
A->R = C->L;
B->L = C->R;
C->L = A;
C->R = B;
A->height = max(Get_Height(A->L), Get_Height(A->R)) + 1;
B->height = max(Get_Height(B->L), Get_Height(B->R)) + 1;
C->height = max(Get_Height(C->L), Get_Height(C->R)) + 1;
return C;
}
Node* insert(Node* T,int num)
{
if (!T)
{
T = new Node;
T->Data = num;
T->height = 0;
T->L = NULL;
T->R = NULL;
}
else
{
if (num < T->Data)
{
T->L = insert(T->L, num);
if (Get_Height(T->L) - Get_Height(T->R) == 2)
{
if (num < T->L->Data)
T = LLRotation(T);
else if (num > T->L->Data)
T = LRRotation(T);
}
}
else if (num > T->Data)
{
T->R = insert(T->R, num);
if (Get_Height(T->L) - Get_Height(T->R) == -2)
{
if (num < T->R->Data)
T = RLRotation(T);
else if (num > T->R->Data)
T = RRRotation(T);
}
}
}
T->height = max(Get_Height(T->R), Get_Height(T->L)) + 1;
return T;
}
int main()
{
int N;
cin >> N;
int k = 0;
Node* Root = NULL;
for (int i = 0; i < N; i++)
{
cin >> k;
Root = insert(Root, k);
}
cout << Root->Data;
system("pause");
return 0;
}