04-树5 Root of AVL Tree (25 分)(C++)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值