#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
using namespace std;
struct node
{
int data,h;
node* l;
node* r;
};
node* root=NULL;
int geth(node* p)//为了防止出现访问到NULL->h的情况,最好写一个函数出来
{
if(p==NULL)
return 0;
return p->h;
}
void update(node* p)//更新高度
{
p->h=max( geth(p->l),geth(p->r) )+1;
}
int bf(node* p)
{
return geth(p->l) - geth(p->r);
}
void L(node* &p)//L旋就是逆时针转。不用理会什么LR、RR之类的,那些是树型
{
node* temp;//必须要用temp保存即 将是新的根 的地址,因为要更新两个节点的h,不保存的话就找不到了
temp=p->r;
p->r=temp->l;
temp->l=p;
update(p);
update(temp);
p=temp;//之所以要引用的原因
}
void R(node* &p)//将上面函数里的l r互换即可
{
node* temp;
temp=p->l;
p->l=temp->r;
temp->r=p;
update(p);
update(temp);
p=temp;
}
void insertt(node* &p,int x)//插入函数要用到引用
{
if(p==NULL)
{
p=(node*)malloc(sizeof(node));
p->data=x;
p->h=1;
p->l=NULL;
p->r=NULL;
return;
}
if(x < p->data)
{
insertt(p->l,x);
update(p);//插入完毕之后要递归更新节点的高度。这样触底反弹之后return可以最早碰到最小不平衡子树的根
if(bf(p)==2)
{
if(bf(p->l)==1)//斜线型: o
{ // o
R(p); // o
}
else if
(bf(p->l)==-1)//先左转后右转 o
{ // o
L(p->l); // o
R(p);
}
}
}
else
{
insertt(p->r,x);
update(p);
if(bf(p)==-2)
{
if(bf(p->r)==-1)
{
L(p);
}
else if(bf(p->r)==1)
{
R(p->r);
L(p);
}
}
}
return;//
}
int main()
{
freopen("in.txt","r",stdin);
int N;;
scanf("%d",&N);
for(int i=0;i<N;i++)
{
int t;
scanf("%d",&t);
insertt(root,t);
}
printf("%d",root->data);
return 0;
}
1066. Root of AVL Tree (25)--AVL树
最新推荐文章于 2019-11-09 15:48:28 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)