Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5 88 70 61 96 120
Example Output
70
Hint
Author
xam
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct BiTNode
{
int data;
BiTNode *lchild;
BiTNode *rchild;
int height;
}BiTNode, *BiTree;
int Max(int x, int y)
{
return x > y ? x : y;
}
int Deep(BiTree T)
{
if(T == NULL)
{
return -1;
}
return T -> height;
}
BiTree LLRotate(BiTree p)
{
BiTree p1;
p1 = p -> lchild;
p -> lchild = p1 -> rchild;
p1 -> rchild = p;
p -> height = Max(Deep(p -> lchild), Deep(p -> rchild)) + 1;
p1 -> height = Max(Deep(p1 -> lchild), p -> height) + 1;
return p1;
}
BiTree RRRotate(BiTree p)
{
BiTree p1;
p1 = p -> rchild;
p -> rchild = p1 -> lchild;
p1 -> lchild = p;
p -> height = Max(Deep(p -> lchild), Deep(p -> rchild)) + 1;
p1 -> height = Max(Deep(p1 -> rchild), p -> height) + 1;
return p1;
}
BiTree LRRotate(BiTree p)
{
p -> lchild = RRRotate(p -> lchild);
return LLRotate(p);
}
BiTree RLRotate(BiTree p)
{
p -> rchild = LLRotate(p -> rchild);
return RRRotate(p);
}
BiTree Insert(BiTree T, int x)
{
if(T == NULL)
{
T = new BiTNode;
T -> data = x;
T -> lchild = NULL;
T -> rchild = NULL;
T -> height = 0;
}
else
{
if(x < T -> data)
{
T -> lchild = Insert(T -> lchild ,x);
if(Deep(T -> lchild) - Deep(T -> rchild) == 2)
{
if(x < T -> lchild -> data)
{
T = LLRotate(T);
}
else
{
T = LRRotate(T);
}
}
}
else
{
T -> rchild = Insert(T -> rchild, x);
if(Deep(T -> rchild) - Deep(T -> lchild) == 2)
{
if(x > T -> rchild -> data)
{
T = RRRotate(T);
}
else
{
T = RLRotate(T);
}
}
}
}
T -> height = Max(Deep(T -> lchild), Deep(T -> rchild)) + 1;
return T;
}
int main()
{
int n, x;
BiTree T;
T = NULL;
scanf("%d", &n);
while(n --)
{
scanf("%d", &x);
T = Insert(T, x);
}
printf("%d\n", T -> data);
return 0;
}
还是看了大神的代码后才想出来的
![尴尬](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)