pat甲 1066. Root of AVL Tree (AVL树)

1066. Root of AVL Tree (25)

时间限制
100 ms
内存限制
65536 kB
代码长度限制
16000 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
tips:1.不要使用0下标
2.k代表旋转类型,1右旋,0左旋
#include<iostream>
#include<queue>

using namespace std;

int n,rt,sz;
int a[55],h[55],t[55][2],f[55];

int getnode(int val,int fr)
{
	sz++;a[sz]=val;h[sz]=1;f[sz]=fr;return sz;
}
void count(int x)
{
	h[x]= max(h[t[x][0]],h[t[x][1]])+1;
}
void rotate(int x,int k)
{
	int fr=f[x];int g=f[fr];
	
	t[fr][!k]=t[x][k];if(t[x][k])f[t[x][k]]=fr;
	
	if(g)t[g][fr==t[g][1]]=x;f[x]=g;
	
	t[x][k]=fr;f[fr]=x;
	count(fr);count(x); 
}
int change(int x)
{
	for(int g=f[f[x]];g;g=f[f[x]])
	{
		count(f[x]);count(g);
		if(abs(h[t[g][0]]-h[t[g][1]])>1)
		{
			int y= x==t[f[x]][0];
			int z=f[x]==t[g][0];
			
			y^z?(rotate(x,y),rotate(x,z)):rotate(f[x],z); 
		}
		else x=f[x];
	}
	while(f[x]){count(x);x=f[x];}
	return x;
}
void insert(int &x,int y)
{
	if(!x){x=getnode(y,x);return;}
	
	for(int i=x;;i=t[i][y>a[i]])
	{
		if(t[i][y>a[i]])continue;
		t[i][y>a[i]]=getnode(y,i);
		x=change(t[i][y>a[i]]);return ;
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		insert(rt,x);
	}
	cout<<a[rt]<<endl;
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值