Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Sample
Input
5
88 70 61 96 120
Output
70
Hint
#include<bits/stdc++.h>
using namespace std;
typedef struct node
{
int data;
struct node *l, *r;
} tree;
int geth(tree *root)
{
int de = 0;
if(root)
{
int left_depth = geth(root->l);
int right_depth = geth(root->r);
de = left_depth > right_depth ? left_depth + 1 : right_depth + 1;
}
return de;
}
tree *LL(tree *root)
{
tree *p;
p = root->l;
root->l = p->r;
p->r = root;
return p;
}
tree *RR(tree *root)
{
tree *p;
p = root->r;
root->r = p->l;
p->l = root;
return p;
}
tree *LR(tree *root)
{
root->l = RR(root->l);
root = LL(root);
return root;
}
tree *RL(tree *root)
{
root->r = LL(root->r);
root = RR(root);
return root;
}
tree *create(tree *root, int k)
{
if(root == NULL)
{
root = new tree;
root->data = k;
root->l = NULL;
root->r = NULL;
}
else
{
if(k < root->data)
root->l = create(root->l, k);
else
root->r = create(root->r, k);
}
if(geth(root->l) - geth(root->r) >= 2)
{
if(geth(root->l->l) > geth(root->l->r))
root = LL(root);
else
root = LR(root);
}
if(geth(root->r) - geth(root->l) >= 2)
{
if(geth(root->r->r) > geth(root->r->l))
root = RR(root);
else
root = RL(root);
}
return root;
}
int main()
{
ios::sync_with_stdio(0);
int n, k;
cin >> n;
tree *root = NULL;
while(n--)
{
cin >> k;
root = create(root,k);
}
cout << root->data << endl;
return 0;
}