PAT (Advanced Level) 1066 Root of AVL Tree/Acwing 1552. AVL树的根

平衡树
avl的板子,跟treap不同的是需要自己判断高度差(四种情况)来实现平衡
#include<bits/stdc++.h>
using namespace std;

const int N = 30;

int idx;

struct NODE{
	int l,r;
	int key;
	int h;
}node[N];

int newnode(int key){
	node[++idx].key=key;
	return idx;
}

void update(int p){
	node[p].h=max(node[node[p].l].h,node[node[p].r].h)+1;
}

void zig(int &p){
	int q=node[p].l;
	node[p].l=node[q].r;
	node[q].r=p;
	p=q;
	update(node[p].r),update(p);
}

void zag(int &p){
	int q=node[p].r;
	node[p].r=node[q].l;
	node[q].l=p;
	p=q;
	update(node[p].l),update(p);
}

int get_balance(int p){
	return node[node[p].l].h-node[node[p].r].h;
}

void insert(int &p,int key){
	if(!p) p=newnode(key);
	else{
		if(node[p].key>key) insert(node[p].l,key);
		else insert(node[p].r,key);
		if(get_balance(p)==2){
			if(get_balance(node[p].l)==1) zig(p);
			else zag(node[p].l),zig(p);
		}
		else if(get_balance(p)==-2){
			if(get_balance(node[p].r)==-1) zag(p);
			else zig(node[p].r),zag(p);
		}
	}
	update(p);
}

int main(){
	int n,root=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		insert(root,x);
	}
	cout<<node[root].key;
	return 0;
}
posted @ 2022-05-25 17:12  xhy666  阅读(35)  评论(0)    收藏  举报