Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Sample Input
5
88 70 61 96 120
Sample Output
70
Hint
Source
xam
图解:
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
struct node* l; // 左右指针
struct node* r;
int data; // 数据
int dp; // 深度
}tree;
int max(int a, int b){ // 取较大值函数
if (a > b){
return a;
}
return b;
}
int get_deep(tree* t){ // 获取该结点深度
if (t == NULL){
return -1;
}
return t->dp;
}
tree* LL(tree *t){ // LL型右旋
tree* p;
p = t->l;
t->l = p->r;
p->r = t;
p->dp = max(get_deep(p->l), get_deep(p->r))+1;
t->dp = max(get_deep(t->l), get_deep(t->r))+1;
return p;
}
tree* RR(tree* t){ // RR型左旋
tree* p;
p = t->r;
t->r = p->l;
p->l = t;
p->dp = max(get_deep(p->l), get_deep(p->r))+1;
t->dp = max(get_deep(t->l), get_deep(t->r))+1;
return p;
}
tree* LR(tree* t){ // LR型先左旋后右旋
t->l = RR(t->l);
return LL(t);
}
tree* RL(tree* t){ // RL型先右旋后左旋
t->r = LL(t->r);
return RR(t);
}
tree* build(tree* t, int key){ // 建立平衡二叉树
if (t == NULL){ // 结点为空,直接插入
t = (tree*)malloc(sizeof(tree));
t->data = key;
t->dp = 0;
t->l = NULL;
t->r = NULL;
}
else if (key < t->data) { // 插入值小于结点值时,向左插
t->l = build(t->l, key);
if (get_deep(t->l) - get_deep(t->r) > 1) { // 不平衡,则调整
if (t->l->data > key) { // 若插在左子树的左子树上
t = LL(t);
}
else {
t = LR(t);
}
}
}
else if (key > t->data){
t->r = build(t->r, key);
if (get_deep(t->r)-get_deep(t->l) > 1){
if (t->r->data < key){
t = RR(t);
}
else{
t = RL(t);
}
}
}
t->dp = max(get_deep(t->l), get_deep(t->r))+1; // 更新深度
return t;
}
int main(){
int n, num;
tree* root = NULL;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &num);
root = build(root, num);
}
printf("%d\n", root->data);
return 0;
}