数据结构实验之查找二:平衡二叉树
Time Limit: 400ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
5 88 70 61 96 120
示例输出
70
提示
只是在二叉排序树上增加了深度判断和树的旋转,模板来源→
戳进来(仅仅只是改了变量名)
树的旋转。(这里面的LR形和RL形对应我的代码似乎是相反的) 这题数据竟然加强了(RE),后面对代码进行了修改。
来源
xam
示例程序
#include <stdio.h>
#include <stdlib.h>
struct tree
{
int d,dp;
struct tree *l,*r;
};
int max(int x,int y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
int deep(struct tree *t)
{
if(t==NULL)
{
return -1;
}
else
{
return t->dp;
}
}
struct tree *LL(struct tree *t)
{
struct tree *p;
p=t->l;
t->l=p->r;
p->r=t;p->dp=max(deep(p->l),t->dp)+1;
t->dp=max(deep(t->l),deep(t->r))+1;
return p;
}
struct tree *RR(struct tree *t)
{
struct tree *p;
p=t->r;
t->r=p->l;
p->l=t;p->dp=max(deep(p->r),t->dp)+1;
t->dp=max(deep(t->l),deep(t->r))+1;
return p;
}
struct tree *RL(struct tree *t)
{
t->r=LL(t->r);
return RR(t);
}
struct tree *LR(struct tree *t)
{
t->l=RR(t->l);
return LL(t);
};
struct tree *create(struct tree *t,int x)
{
if(t==NULL)
{
t=(struct tree *)malloc(sizeof(struct tree));
t->l=NULL;
t->r=NULL;
t->d=x;
t->dp=0;
}
else if(x<t->d)
{
t->l=create(t->l,x);
if(deep(t->l)-deep(t->r)>1)
{
if(x<t->l->d)
{
t=LL(t);
}
else
{
t=LR(t);
}
}
}
else if(x>t->d)
{
t->r=create(t->r,x);
if(deep(t->r)-deep(t->l)>1)
{
if(x>t->r->d)
{
t=RR(t);
}
else
{
t=RL(t);
}
}
}
t->dp=max(deep(t->l),deep(t->r))+1;
return t;
}
int main()
{
int n,i,x;
scanf("%d",&n);
struct tree *h=NULL;
for(i=1;n>=i;i++)
{
scanf("%d",&x);
h=create(h,x);
}
printf("%d",h->d);
return 0;
}
/**************************************
Problem id : SDUT OJ 3374
Code Len : 1924B
Result : Accepted
Take Memory : 300K
Take Time : 0MS
Submit Time : 2016-08-27 19:52:37
**************************************/