Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Sample Input
5
88 70 61 96 120
Sample Output
70
#include <stdio.h>
#include <stdlib.h>
struct treenode
{
int data;
int dp;
struct treenode *ltreenode;
struct treenode *rtreenode;
};
struct treenode *Insert(struct treenode *root, int n);
int max_dp(struct treenode *lchild, struct treenode *rchild);
int deep(struct treenode *root);
struct treenode *LL(struct treenode *root);
struct treenode *LR(struct treenode *root);
struct treenode *RL(struct treenode *root);
struct treenode *RR(struct treenode *root);
int main()
{
int n;
scanf("%d", &n);
int a;
struct treenode *root = NULL;
while(n--)
{
scanf("%d", &a);
root = Insert(root, a);
}
printf("%d\n", root->data);
return 0;
}
struct treenode *LL(struct treenode *root)
{
struct treenode *p = root->ltreenode;
root->ltreenode = p->rtreenode;
p->rtreenode = root;
root->dp = deep(root);
p->dp = deep(p);
return p;
}
struct treenode *RR(struct treenode *root)
{
struct treenode *p = root->rtreenode;
root->rtreenode = p->ltreenode;
p->ltreenode = root;
root->dp = deep(root);
p->dp = deep(root);
return p;
}
struct treenode *LR(struct treenode *root)
{
root->ltreenode = RR(root->ltreenode);
return LL(root);
}
struct treenode *RL(struct treenode *root)
{
root->rtreenode = LL(root->rtreenode);
return RR(root);
}
int deep(struct treenode *root)
{
if(root == NULL)
return 0;
return max_dp(root->ltreenode, root->rtreenode) + 1;
}
struct treenode *Insert(struct treenode *root, int n)
{
if(!root)
{
root = (struct treenode *)malloc(sizeof(struct treenode));
root->data = n;
root->ltreenode = NULL;
root->rtreenode = NULL;
}
else
{
if(n < root->data)
root->ltreenode = Insert(root->ltreenode, n);
else
root->rtreenode = Insert(root->rtreenode, n);
//深度差出现失衡时去调整树结构
if(abs(deep(root->ltreenode) - deep(root->rtreenode)) >= 2)
{
struct treenode *p;
if(deep(root->ltreenode) > deep(root->rtreenode))
{
p = root->ltreenode;
//判断失衡出现在左节点还是右节点
if(deep(p->ltreenode) > deep(p->rtreenode))
root = LL(root);
else
root = LR(root);
}
else
{
p = root->rtreenode;
//如上
if(deep(p->ltreenode) > deep(p->rtreenode))
root = RL(root);
else
root = RR(root);
}
}
}
//回溯时更新dp值
root->dp = deep(root);
return root;
}
int max_dp(struct treenode *lchild, struct treenode *rchild)
{
int DP;
if(!lchild && !rchild)
DP = 0;
else if(!lchild)
DP = rchild->dp;
else if(!rchild)
DP = lchild->dp;
else
{
if(lchild->dp > rchild->dp)
DP = lchild->dp;
else
DP = rchild->dp;
}
return DP;
}