PAT A 1066. 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 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

 

平衡二叉树调整问题

 

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

struct node	//树中的点
{
	node *left;
	node *right;
	int val;	//值
	int height;	//高度,从0开始计数
	node(int v=0,node *l=NULL,node *r=NULL,int h=0):val(v),left(l),right(r),height(h){};
};

int Get_height(node *n);	//返回高度,可以处理NULL
bool Is_balance(node *l,node *r);	//是否平衡
node* insert(node *root,int val);	//将val插入以root为根的平衡树中
node* Rotleft(node *root);		//左转
node* Rotright(node *root);		//右转

int main()
{
	int n;
	cin>>n;
	int i,temp;
	node *root=NULL;
	for(i=0;i<n;i++)
	{
		scanf("%d",&temp);
		root=insert(root,temp);
	}
	cout<<root->val;

	return 0;
}

int Get_height(node *n)
{
	if(n==NULL)
		return -1;
	else
		return n->height;
}

bool Is_balance(node *l,node *r)
{
	return abs(Get_height(l)-Get_height(r))<2;
}

node* insert(node *root,int val)	//递归调用,直到获得NULL,即插入位置
{
	if(root==NULL)
	{
		root=new node(val);
		return root;
	}
	if(val<root->val)	//比值小,插入到左子树中
	{
		root->left=insert(root->left,val);
		if(!Is_balance(root->left,root->right))	//保持平衡性
		{
			if(val<root->left->val)	//插入在左子树的左子树
				root=Rotright(root);
			else				//插入在左子树的右子树
			{
				root->left=Rotleft(root->left);
				root=Rotright(root);
			}
		}
	}
	else	//比值大,插入到右子树中
	{
		root->right=insert(root->right,val);
		if(!Is_balance(root->left,root->right))	//保持平衡性
		{
			if(val>root->right->val)	//插入在右子树的右子树
				root=Rotleft(root);
			else	//插入在右子树的左子树
			{
				root->right=Rotright(root->right);
				root=Rotleft(root);
			}
		}
	}
	root->height=max(Get_height(root->left),Get_height(root->right))+1;
	return root;
}

node* Rotleft(node *root)	//节点左转
{
	node *t=root->right;
	root->right=t->left;
	t->left=root;
	root->height=max(Get_height(root->left),Get_height(root->right))+1;
	t->height=max(Get_height(t->left),Get_height(t->right))+1;
	return t;
}

node* Rotright(node *root)	//节点右转
{
	node *t=root->left;
	root->left=t->right;
	t->right=root;
	root->height=max(Get_height(root->left),Get_height(root->right))+1;
	t->height=max(Get_height(t->left),Get_height(t->right))+1;
	return t;
}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值