数据结构实验之查找二:平衡二叉树
Time Limit: 400MS Memory limit: 65536K
题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
5
88 70 61 96 120
示例输出
70
提示:ACM.SDUT后台改了点数据,网上有些代码可能不对。
来源
xam
示例程序
#include <stdio.h>
#include <stdlib.h>
typedef int element;
typedef struct BiTnNode
{
element data;
int id;
BiTnNode *lchild,*rchild;
}BiTnNode, *BiTree;
int max(int a,int b)
{
return a>b?a:b;
}
int Depth(BiTree T)
{
if(!T)
return -1;
return T->id;
}
BiTree LL(BiTree T)
{
BiTree q=T->lchild;
T->lchild=q->rchild;
q->rchild=T;
q->id=max(Depth(q->lchild),Depth(q->rchild))+1;
T->id=max(Depth(T->lchild),Depth(T->rchild))+1;
return q;
}
BiTree RR(BiTree T)
{
BiTree q=T->rchild;
T->rchild=q->lchild;
q->lchild=T;
q->id=max(Depth(q->lchild),Depth(q->rchild))+1;
T->id=max(Depth(T->lchild),Depth(T->rchild))+1;
return q;
}
BiTree LR(BiTree T)
{
T->lchild=RR(T->lchild);
return LL(T);
}
BiTree RL(BiTree T)
{
T->rchild=LL(T->rchild);
return RR(T);
}
void CreateTree(BiTree &T,int key)
{
if(T==NULL)
{
T=new BiTnNode;
T->data=key;
T->lchild=T->rchild=NULL;
T->id=0;
}
else
{
if(key < T->data)
{
CreateTree(T->lchild,key);
if(Depth(T->lchild)-Depth(T->rchild)>1)
{
if(key < T->lchild->data)
T=LL(T);
else
T=LR(T);
}
}
else if(key > T->data)
{
CreateTree(T->rchild,key);
if(Depth(T->rchild)-Depth(T->lchild)>1)
{
if(key > T->rchild->data)
T=RR(T);
else
T=RL(T);
}
}
}
T->id=max(Depth(T->lchild),Depth(T->rchild))+1;
}
int main()
{
int n,i;
int a[22];
BiTree T;
T=NULL;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
CreateTree(T,a[i]);
}
printf("%d\n",T->data);
return 0;
}