Root of AVL Tree(AVL树的插入、旋转操作)

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

大意:建立一个平衡二叉树,返回它的根结点

AC代码:

#include <cstdio>   
#include <iostream> 
#include <algorithm> 
#include <cmath> 
#include <cstdlib> 
#include <cstring> 
#include <vector> 
#include <list> 
#include <map> 
#include <stack> 
#include <queue> 
using namespace std; 
#define ll long long
typedef struct AVLNode
{
	int data;
	int height;
	AVLNode *l,*r;	
}*AVLTree;
int Getheight(AVLTree A)
{
	if(!A)
		return 0;
	else
		return A->height;
}
AVLTree  LeftRotation(AVLTree A)
{
	AVLTree B = A->l;
	A->l = B->r;
	B->r = A;
	A->height = max(Getheight(A->l),Getheight(A->r))+1;
	B->height = max(Getheight(B->l),A->height)+1;
	return B;
}
AVLTree RightRotation(AVLTree A)
{
	AVLTree B = A->r;
	A->r = B->l;
	B->l = A;
	A->height = max(Getheight(A->l),Getheight(A->r))+1;
	B->height = max(A->height,Getheight(B->r))+1;
	return B;
}
AVLTree LeftRightRotation(AVLTree A)
{
	A->l = RightRotation(A->l);
	return LeftRotation(A);
}
AVLTree RightLeftRotation(AVLTree A)
{
	A->r = LeftRotation(A->r);
	return RightRotation(A);
}
AVLTree Insert(AVLTree T,int x)
{
	if(!T)
	{
		T = new AVLNode;
		T->data = x;
		T->height = 1;
		T->l = T->r = NULL;
	}
	else if(x < T->data)
	{
		T->l = Insert(T->l,x);
		if(Getheight(T->l)-Getheight(T->r) == 2)
		{
			if(x < T->l->data)
				T = LeftRotation(T);
			else
				T = LeftRightRotation(T);
		}
	}
	else if(x > T->data)
	{
		T->r = Insert(T->r,x);
		if(Getheight(T->r)-Getheight(T->l) == 2)
		{
			if(x > T->r->data)
				T = RightRotation(T);
			else
				T = RightLeftRotation(T);
		}
	}
	T->height = max(Getheight(T->l),Getheight(T->r))+1;
	return T;
}
int main() 
{
	int n;
	while(cin >> n)
	{
		AVLTree T;
		T = NULL;
		while(n--)
		{
			int x;
			cin >> x;
			T = Insert(T,x);
		}
		cout << T->data <<endl;
	}
    //cout << "AC" <<endl; 
    return 0; 
} 

猜你喜欢

转载自blog.csdn.net/MMMMMMMW/article/details/80212520
今日推荐