平衡二叉树模板
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{int ndata; //記錄關(guān)鍵字?jǐn)?shù)值node *l,*r;int nheight; //平衡因子
};
int height(node* p) //返回樹p的深度
{if(p==NULL)return -1;return p->nheight;
}
node* LLRotate(node* p) //對(duì)LL型直接在不平衡結(jié)點(diǎn)進(jìn)行左旋轉(zhuǎn)
{node* p1;p1=p->l;p->l=p1->r;p1->r=p;p->nheight=max(height(p->l),height(p->r))+1; //結(jié)點(diǎn)的位置變了,要更新結(jié)點(diǎn)的高度值p1->nheight=max(height(p1->l),p->nheight)+1;return p1;
}
node* RRRotate(node* p) //對(duì)RR型直接在不平衡結(jié)點(diǎn)進(jìn)行右旋轉(zhuǎn)
{node* p1;p1=p->r;p->r=p1->l;p1->l=p;p->nheight=max(height(p->l),height(p->r))+1;p1->nheight=max(height(p1->r),p->nheight)+1;return p1;
}
node* LRRotate(node* p)
{p->l=RRRotate(p->l); //在不平衡結(jié)點(diǎn)p的左兒子處進(jìn)行右旋轉(zhuǎn)return LLRotate(p); //在不平衡結(jié)點(diǎn)p處進(jìn)行左旋轉(zhuǎn)并返回新的根
}
node* RLRotate(node* p)
{p->r=LLRotate(p->r); //在不平衡結(jié)點(diǎn)p的右兒子處進(jìn)行左旋轉(zhuǎn)return RRRotate(p); //在不平衡結(jié)點(diǎn)p處進(jìn)行左旋轉(zhuǎn)并返回新的根
}
node* _Insert(int s,node* p)
{if(p==NULL) //待插入的值賦給新開辟的結(jié)點(diǎn){p=new node;p->ndata=s;p->nheight=0;p->l=p->r=NULL;}else if(s<p->ndata) //若待插入的值小于p的關(guān)鍵字?jǐn)?shù)值,則插入到左子樹中{p->l=_Insert(s,p->l);if(height(p->l)-height(p->r)==2) //該樹出現(xiàn)不平衡{if(s<p->l->ndata) //若待插入的值插到了左兒子的左子樹上則單旋轉(zhuǎn)p=LLRotate(p);else //反之,雙旋轉(zhuǎn)p=LRRotate(p);}}else if(s>p->ndata) //道理同上{p->r=_Insert(s,p->r);if(height(p->l)-height(p->r)==-2){if(s>p->r->ndata)p=RRRotate(p);elsep=RLRotate(p);}}p->nheight=max(height(p->l),height(p->r))+1;return p;
}
int main()
{int n;while(~scanf("%d",&n)){node *head=NULL;while(n--){int x;scanf("%d",&x);head=_Insert(x,head);}printf("%d\n",head->ndata);}return 0;
}
總結(jié)
- 上一篇: Arrays.sort()用来自定义排序
- 下一篇: 搭建zookeeper集群环境详解