04-树3. Root of AVL Tree

04-树3. Root of AVL Tree (25)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

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 120
Sample Output 1:
70
Sample Input 2:
7
88 70 61 96 120 90 65
Sample Output 2:

88


AVL的测试水题,逻辑没有问题。 。关键还是记代码或者说背代码,(LL,RR,LR,RL)-->AVL。add oil!背背背!!

#include<stdio.h>
#include<stdlib.h>
typedef struct avl{
	int data;
	struct avl* left;
	struct avl* right;
	int hign;
}AVL;

int Max(int a,int b);
int GetHeight(AVL* BT);
AVL* insert(int x,AVL* T);
AVL* RightRotation(AVL* A); 
AVL* LeftRotation(AVL* A);
AVL* RightLeftRotation(AVL* A);
AVL* LeftRightRotation(AVL* A);

int main(){
	int n,i,k;
	scanf("%d",&n);
	AVL* avlT = NULL;
	for(i = 0;i<n;i++){
		scanf("%d",&k);
		avlT = insert(k,avlT);
	}
	printf("%d",avlT->data);
	return 0;
} 

AVL* insert(int x,AVL* T){
	if(T == NULL){
		T = (AVL*)malloc(sizeof(AVL));
		T->data = x;
		T->left = T->right = NULL;
		T->hign = 0;
	}
	else if(x<T->data){
		T->left = insert(x,T->left);
		if(2 == GetHeight(T->left) - GetHeight(T->right))
//		左旋
			if(x<T->left->data)
//			LL
				T = LeftRotation(T);
			else
//			LR
				T = LeftRightRotation(T);	 
	}
	else if(x>T->data){
		T->right = insert(x,T->right);
		if(2 == GetHeight(T->right) - GetHeight(T->left))
//		右旋
			if(x>T->right->data)
//			RR
				T = RightRotation(T);
			else
//			RL
				T = RightLeftRotation(T); 
	}
	T->hign = Max(GetHeight(T->left),GetHeight(T->right))+1;
	return T;
}
int Max(int a,int b){
	if(a>b)
		return a;
	else
		return b;
}

AVL* LeftRotation(AVL* A){
	AVL* B = A->left;
	A->left = B->right;
	B->right = A;
	A->hign = Max(GetHeight(A->left),GetHeight(A->right)) + 1;
	B->hign = Max(GetHeight(B->left),A->hign) + 1;
	
	return B;
}

AVL* RightRotation(AVL* A){
	AVL* B = A->right;
	A->right = B->left;
	B->left = A;
	A->hign = Max(GetHeight(A->left),GetHeight(A->right)) + 1;
	B->hign = Max(GetHeight(B->left),A->hign) + 1;
	
	return B;
}

AVL* LeftRightRotation(AVL* A){
	A->left = RightRotation(A->left);
	return LeftRotation(A); 
}

AVL* RightLeftRotation(AVL* A){
	A->right = LeftRotation(A->right);
	return RightRotation(A); 
}

int GetHeight(AVL* BT){
	int HL,HR,MaxH;
	
	if(BT!=NULL){
		HL = GetHeight(BT->left);
		HR = GetHeight(BT->right);
		MaxH = HL > HR ? HL : HR;
		return MaxH+1;
	}
	else 
		return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值