数据结构实验之查找二:平衡二叉树
Time Limit: 400 ms Memory Limit: 65536 KiB
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Sample Input
5
88 70 61 96 120
Sample Output
70
我觉得这道题重点在于要更新深度以及判断什么时候要进行操作,具体的左旋右旋其实就是指针的操作,自己在纸上画一下就写出来代码了。
AC代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct treenode
{
int data;
int deepth;//存深度
struct treenode *l,*r;
} tree;
int max(int a,int b)
{
return a>b ? a:b;
}
int deep(tree*t)//求深度
{
if(t==NULL)
{
return -1;
}
else
{
return t->deepth;
}
}
tree *LL(tree*t)
{
tree*p=t->l;
t->l=p->r;
p->r=t;
t->deepth=max(deep(t->l),deep(t->r))+1;
p->deepth=max(deep(p->l),deep(t->r))+1;
return p;
}
tree *RR(tree*t)
{
tree*p=t->r;
t->r=p->l;
p->l=t;
t->deepth=max(deep(t->l),deep(t->r))+1;
p->deepth=max(deep(p->l),deep(t->r))+1;
return p;
}
tree *LR(tree*t)
{
t->l=RR(t->l);//先做左旋
return LL(t);//再做右旋
}
tree *RL(tree*t)
{
t->r=LL(t->r);//先做右旋
return RR(t);//再做左旋
}
tree *creat(tree*t,int x)
{
if(t==NULL)
{
t=(tree*)malloc(sizeof(tree));
t->data=x;
t->deepth=0;
t->l=t->r=NULL;
}
else if(x<t->data)
{
t->l=creat(t->l,x);
if(deep(t->l)-deep(t->r)>1)//如果左子树和右子树之差大于1,则需要进行操作
{
if(t->l->data>x)
{
t=LL(t);
}
else
{
t=LR(t);
}
}
}
else if(x>t->data)
{
t->r=creat(t->r,x);
if(deep(t->r)-deep(t->l)>1)//如果右子树和左子树之差大于1,则需要进行操作
{
if(t->r->data>x)
{
t=RL(t);
}
else
{
t=RR(t);
}
}
}
t->deepth=max(deep(t->l),deep(t->r))+1;//注意这里要更新深度
return t;
}
int main()
{
int i,n,m;
scanf ("%d",&n);
tree*t = NULL;
for(i=0; i<n; i++)
{
scanf ("%d",&m);
t=creat(t,m);
}
printf("%d\n",t->data);
return 0;
}