Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5 88 70 61 96 120
Example Output
70
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR -1
#define OK 1
typedef int Elemtype;
typedef struct BiTnode
{
Elemtype data;
int d;
struct BiTnode *lchild, *rchild;
}BiTnode, *Bitree;
Bitree Creat(Bitree T, int a);
Bitree LL(Bitree T);
Bitree RR(Bitree T);
Bitree LR(Bitree T);
Bitree RL(Bitree T);
int Deep(Bitree T);
int Max(int x, int y);
int main()
{
int n, x;
Bitree T = NULL;
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
T = Creat(T, x);
}
printf("%d\n", T -> data);
return 0;
}
Bitree Creat(Bitree T, int a)
{
if(!T)
{
T = (Bitree)malloc(sizeof(BiTnode));
T -> d = 0;
T -> data = a;
T -> lchild = T -> rchild = NULL;
}
else if(T -> data > a)
{
T -> lchild = Creat(T -> lchild, a);
if(Deep(T -> lchild) - Deep(T -> rchild) > 1)
{
if(T -> lchild -> data > a)
T = LL(T);
else
T = LR(T);
}
}
else if(T -> data < a)
{
T -> rchild = Creat(T -> rchild, a);
if(Deep(T -> rchild) - Deep(T -> lchild) > 1)
{
if(T -> rchild -> data > a)
T = RL(T);
else
T = RR(T);
}
}
T -> d = Max(Deep(T -> lchild), Deep(T -> rchild)) + 1;
return T;
}
Bitree LL(Bitree T)
{
Bitree p;
p = T -> lchild;
T -> lchild = p -> rchild;
p -> rchild = T;
p -> d = Max(Deep(p -> lchild), Deep(p -> rchild)) + 1;
T -> d = Max(Deep(T -> lchild), Deep(T -> rchild)) + 1;
return p;
}
Bitree RR(Bitree T)
{
Bitree p;
p = T -> rchild;
T -> rchild = p -> lchild;
p -> lchild = T;
p -> d = Max(Deep(p -> lchild), Deep(p -> rchild)) + 1;
T -> d = Max(Deep(T -> lchild), Deep(T -> rchild)) + 1;
return p;
}
Bitree LR(Bitree T)
{
T -> lchild = RR(T -> lchild);
return LL(T);
}
Bitree RL(Bitree T)
{
T -> rchild = LL(T -> rchild);
return RR(T);
}
int Deep(Bitree T)
{
if(!T)
return -1;
else
return T -> d;
}
int Max(int x, int y)
{
return x > y ? x : y;
}