Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
新的改变
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
功能快捷键
输出平衡二叉树的树根。
合理的创建标题,有助于目录的生成
Input
5
88 70 61 96 120
Output
70
代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct Tree
{
int date;
int deep;
struct Tree *l;
struct Tree *r;
}Tree;
int Deep(Tree *tre)
{
if(tre == NULL)
{
return -1;
}
else
{
return tre->deep;
}
}
//更新深度
int New_deep(Tree *tre)
{
int a;
a = (Deep(tre->l)>Deep(tre->r) ? Deep(tre->l) : Deep(tre->r));
return a+1;
}
//左子树左孩子,右旋
Tree *RR_turn(Tree *tre)
{
Tree *p;
p = tre->l;
tre->l = p->r;
p->r = tre;
p->deep = New_deep(p);
tre->deep = New_deep(tre);
return p;
}
//右子树右孩子,左旋
Tree *LL_turn(Tree *tre)
{
Tree *p;
p = tre->r;
tre->r = p->l;
p->l = tre;
p->deep = New_deep(p);
tre->deep = New_deep(tre);
return p;
}
//左子树右孩子 先左后右
Tree *LR_turn(Tree *tre)
{
tre->l = LL_turn(tre->l);
return RR_turn(tre);
}
//右子树左孩子,先右后左
Tree *RL_turn(Tree *tre)
{
tre->r = RR_turn(tre->r);
return LL_turn(tre);
}
Tree *creat(Tree *tre, int k)
{
if(tre==NULL)
{
tre = (Tree *)malloc(sizeof(Tree));
tre->date = k;
tre->deep = 0;
tre->l = tre->r = NULL;
}
else
{
if(k < tre->date)
{
tre->l = creat(tre->l,k);
if(Deep(tre->l)-Deep(tre->r) > 1)
{
if(k < tre->l->date)//左子树左孩子
{
tre = RR_turn(tre);
}
else//左子树右孩子
{
tre = LR_turn(tre);
}
}
}
else
{
tre->r = creat(tre->r,k);
if(Deep(tre->r)-Deep(tre->l) > 1)
{
if(k > tre->r->date)//右子树右孩子
{
tre = LL_turn(tre);
}
else//右子树左孩子
{
tre = RL_turn(tre);
}
}
}
}
//更新深度
tre->deep = New_deep(tre);
return tre;
}
int main()
{
Tree *tre = NULL;
int n,i,j,k;
scanf("%d",&n);
while(n--)
{
scanf("%d", &k);
tre = creat(tre,k);
}
printf("%d\n",tre->date);
return 0;
}