首页 > 代码库 > PAT 1066 平衡树

PAT 1066 平衡树

#include<iostream>
#include<algorithm>
#include<string>
#include<malloc.h>
#include<cstring>
#include<vector>
using namespace std;
#define Max(x,y) ((x)>(y)?(x):(y))
#define ABS(x) ((x)>0?(x):-(x))
struct Node{
	Node* l,*r;
	int val,h;
	Node(int x){
		l=r=NULL;
		h=1;val=x;
	}
	int getH(Node*p){
		return p==NULL?0:p->h;
	}
	bool updateH(){
		int lh=getH(l),rh=getH(r);
		h=Max(lh,rh)+1;
		return ABS(lh-rh)>1;
	}
};
Node *LLRotate(Node* p){
	Node *q=p->l;
	p->l=q->r;
	q->r=p;
	p->updateH();q->updateH();
	return q;
}
Node *RRRotate(Node*p){
	Node *q=p->r;
	p->r=q->l;
	q->l=p;
	p->updateH();q->updateH();
	return q;
}
Node* LRRotate(Node*p){
	p->l=RRRotate(p->l);
	return LLRotate(p);
}
Node* RLRotate(Node*p){
	p->r=LLRotate(p->r);
	return RRRotate(p);
}
Node* build(Node* p,int x){
	if(p==NULL)
		return new Node(x);
	if(p->val>x){
		chooseLeft=true;
		p->l=build(p->l,x);
		if(p->updateH()){
			if(p->getH(p->l->l)>p->getH(p->l->r))
				p=LLRotate(p);
			else p=LRRotate(p);
		}
	}
	else if(p->val<x){
		chooseLeft=false;
		p->r=build(p->r,x);
		if(p->updateH()){
			if(p->getH(p->r->l)>p->getH(p->r->r))
				p=RLRotate(p);
			else p=RRRotate(p);
		}
	}
	p->updateH();
	return p;
}
int main()
{
	int i,n,x;
	scanf("%d",&n);
	Node *root=NULL;
	for(i=0;i<n;++i){
		scanf("%d",&x);
		root=build(root,x);
	}
	printf("%d\n",root->val);
	return 0;
}

PAT 1066 平衡树