平衡二叉树

来源:互联网 发布:淘宝卷皮折扣网 编辑:程序博客网 时间:2024/06/07 05:11

Time Limit: 400MS Memory limit: 65536K

题目描述

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

输入

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

输出

输出平衡二叉树的树根。

示例输入

588 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;}


0 0