平衡二叉树
2015-12-24 10:46
204 查看
Time Limit: 400MS Memory limit: 65536K
题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
5 88 70 61 96 120
示例输出
70#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; struct node { int d,h; node *l,*r; }; int Max(int a,int b) { return a>b?a:b; } int dp(node *rt) { if(!rt) return -1; else return rt->h; } node *LL(node *rt) { node *p=rt->l; rt->l=p->r; p->r=rt; rt->h=Max(dp(rt->l),dp(rt->r))+1; p->h=Max(dp(rt->l),dp(rt->r))+1; return p; } node *RR(node *rt) { node *p=rt->r; rt->r=p->l; p->l=rt; rt->h=Max(dp(rt->l),dp(rt->r))+1; p->h=Max(dp(rt->l),dp(rt->r))+1; return p; } node *LR(node *rt) { rt->l=RR(rt->l); return LL(rt); } node *RL(node *rt) { rt->r=LL(rt->r); return RR(rt); } node *creat(node *rt,int k) { if(!rt) { rt=new node; rt->d=k; rt->h=0; rt->l=rt->r=NULL; } else { if(k<rt->d) { rt->l=creat(rt->l,k); if(dp(rt->l)-dp(rt->r)>1) { if(k<rt->l->d) rt=LL(rt); else rt=LR(rt); } } else { rt->r=creat(rt->r,k); if(dp(rt->l)-dp(rt->r)>1) { if(k>rt->r->d) rt=RR(rt); else rt=RL(rt); } } } rt->h=Max(dp(rt->l),dp(rt->r))+1; return rt; } int main() { int n,m; node *head=NULL; cin>>n; while(n--) { scanf("%d",&m); head=creat(head,m); } cout<<head->d<<endl; return 0; }
相关文章推荐
- 将用户控件添加到选项卡
- Android Studio查看类结构的快捷键
- IOS 手机端搜索硬件设备 --- 物联网
- myeclipse
- 06.(java基础)面试题--03 abstract的用法,以及abstract和interface的异同
- git
- 圆形图片
- listView和gridView中item复用的相关问题
- javax.mail.AuthenticationFailedException: 535 authentication failed
- SSH三大框架的工作原理及流程
- ubuntu安装使用cmake
- jeecms添加站点
- NetBeans的JDBC配置
- iOS完整学习路线图
- UVA-11167 Monkeys in the Emei Mountain(区间模型最大流+输出方案)
- mysql备份和恢复
- Dubbo学习过程、使用经验分享及实现原理简单介绍
- java中对日期的处理
- curator源码(一) 初始化、启动和关闭。
- 全民Scheme(0):lat的定义