首页 > 代码库 > 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 平衡树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。