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.

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

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

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;
}
    原文作者:AVL树
    原文地址: https://blog.csdn.net/qq_27601815/article/details/59139116
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞