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<stdlib.h> #include<iostream> using namespace std; struct node { int data, d; node *l,*r; }; int Deep(node *head) { if(head==NULL) return -1; return head->d; } node *LL(node *head) { struct node *q=head->l; head->l=q->r; q->r=head; q->d=max(Deep(q->l),Deep(q->r))+1; head->d=max(Deep(head->l),Deep(head->r))+1; return q; } node *RR(node *head) { struct node *q=head->r; head->r=q->l; q->l=head; q->d=max(Deep(q->l),Deep(q->r))+1; head->d=max(Deep(head->l),Deep(head->r))+1; return q; } node *LR(node *head) { head->l=RR(head->l); return LL(head); } node *RL(node *head) { head->r=LL(head->r); return RR(head); } node *Creat(struct node *head,int x) { if(!head) { head=new node; head->l = head->r = NULL; head->data=x; head->d=0; } else if(x<head->data) { head->l=Creat(head->l,x); if(Deep(head->l)-Deep(head->r)>1) { if(x<head->l->data) head=LL(head); else head=LR(head); } } else if(x>head->data) { head->r=Creat(head->r,x); if(Deep(head->r)-Deep(head->l)>1) { if(x>head->r->data) head=RR(head); else head=RL(head); } } head->d=max(Deep(head->l),Deep(head->r))+1; return head; } int main() { int n,m; scanf("%d",&n); node *head=NULL; for(int i=0;i<n;i++) { scanf("%d",&m); head=Creat(head,m); } printf("%d\n",head->data); return 0; }