您的位置:首页 > 其它

平衡二叉树

2015-12-24 10:46 204 查看


Time Limit: 400MS Memory limit: 65536K


题目描述

根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。


输入

输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。


输出

输出平衡二叉树的树根。


示例输入

5
88 70 61 96 120



示例输出

70

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

struct node
{
int d,h;
node *l,*r;
};
int Max(int a,int b)
{
return a>b?a:b;
}
int dp(node *rt)
{
if(!rt)
return -1;
else
return rt->h;
}
node *LL(node *rt)
{
node *p=rt->l;
rt->l=p->r;
p->r=rt;
rt->h=Max(dp(rt->l),dp(rt->r))+1;
p->h=Max(dp(rt->l),dp(rt->r))+1;
return p;
}
node *RR(node *rt)
{
node *p=rt->r;
rt->r=p->l;
p->l=rt;
rt->h=Max(dp(rt->l),dp(rt->r))+1;
p->h=Max(dp(rt->l),dp(rt->r))+1;
return p;
}
node *LR(node *rt)
{
rt->l=RR(rt->l);
return LL(rt);
}

node *RL(node *rt)
{
rt->r=LL(rt->r);
return RR(rt);
}
node *creat(node *rt,int k)
{
if(!rt)
{
rt=new node;
rt->d=k;
rt->h=0;
rt->l=rt->r=NULL;
}
else
{
if(k<rt->d)
{
rt->l=creat(rt->l,k);
if(dp(rt->l)-dp(rt->r)>1)
{
if(k<rt->l->d)
rt=LL(rt);
else
rt=LR(rt);
}
}
else
{
rt->r=creat(rt->r,k);
if(dp(rt->l)-dp(rt->r)>1)
{
if(k>rt->r->d)
rt=RR(rt);
else
rt=RL(rt);
}

}
}
rt->h=Max(dp(rt->l),dp(rt->r))+1;
return rt;
}
int main()
{
int n,m;
node *head=NULL;
cin>>n;
while(n--)
{
scanf("%d",&m);
head=creat(head,m);
}
cout<<head->d<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: