平衡二叉树

来源:互联网 发布:红杉网络 编辑:程序博客网 时间:2024/06/05 07:27

题目描述

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

输入

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

输出

输出平衡二叉树的树根。

示例输入

588 70 61 96 120

示例输出

70

提示

 

#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
struct node
{
   int data;
   int d;
   struct node*l,*r;
};
int deep(struct node*t)
{
   if(!t)
    return -1;
   else return t->d;
}
int max(int x,int y)
{
   if(x>y)
    return x;
   else return y;
}
struct node*LL(struct node*t)
{
    struct node*p;
    p=t->l;
    t->l=p->r;
    p->r=t;
    t->d=max(deep(t->l),deep(t->r))+1;
    p->d=max(deep(p->l),deep(p->r))+1;
    return p;

}
struct node*RR(struct node*t)
{
    struct node*p;
    p=t->r;
    t->r=p->l;
    p->l=t;
    t->d=max(deep(t->l),deep(t->r))+1;
    p->d=max(deep(p->l),deep(p->r))+1;
    return p;

}
struct node*LR(struct node*t)
{
    t->l=RR(t->l);//先右旋LR型变成LL型对下一个节点进行相当于逆置的操作
    return LL(t);

}
struct node*RL(struct node*t)
{
    t->r=LL(t->r);
    return RR(t);

}
struct node* creat(struct node*t,int x)
{
    if(t==NULL)
    {
        t=(struct node*)malloc(sizeof(struct node));
        t->data=x;
        t->l=NULL;
        t->r=NULL;
        t->d=0;
    }
    else
    {
    if(x<t->data)
    {
       t->l=creat(t->l,x);
       if(deep(t->l)-deep(t->r)==2)
       {
          if(x<t->l->data)
          {
             t=LL(t);
          }
          else
            t=LR(t);
       }
    }
    else
       {
       t->r=creat(t->r,x);
       if(deep(t->l)-deep(t->r)==-2)
       {
          if(x>t->r->data)
            t=RR(t);
          else
            t=RL(t);
       }
    }}
    t->d=max(deep(t->l),deep(t->r))+1;
    return t;
}
int main()
{
    int n,i,x;
    struct node*t=NULL;
    scanf("%d",&n);
    for(i=0;i<=n-1;i++)
    {
        scanf("%d",&x);
        t=creat(t,x);
    }
    printf("%d\n",t->data);
    return 0;
}


 

 

0 0