平衡二叉树
来源:互联网 发布:红杉网络 编辑:程序博客网 时间:2024/06/05 07:27
题目描述
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
输入
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
输出
输出平衡二叉树的树根。
示例输入
588 70 61 96 120
示例输出
70
提示
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
struct node
{
int data;
int d;
struct node*l,*r;
};
int deep(struct node*t)
{
if(!t)
return -1;
else return t->d;
}
int max(int x,int y)
{
if(x>y)
return x;
else return y;
}
struct node*LL(struct node*t)
{
struct node*p;
p=t->l;
t->l=p->r;
p->r=t;
t->d=max(deep(t->l),deep(t->r))+1;
p->d=max(deep(p->l),deep(p->r))+1;
return p;
}
struct node*RR(struct node*t)
{
struct node*p;
p=t->r;
t->r=p->l;
p->l=t;
t->d=max(deep(t->l),deep(t->r))+1;
p->d=max(deep(p->l),deep(p->r))+1;
return p;
}
struct node*LR(struct node*t)
{
t->l=RR(t->l);//先右旋LR型变成LL型对下一个节点进行相当于逆置的操作
return LL(t);
}
struct node*RL(struct node*t)
{
t->r=LL(t->r);
return RR(t);
}
struct node* creat(struct node*t,int x)
{
if(t==NULL)
{
t=(struct node*)malloc(sizeof(struct node));
t->data=x;
t->l=NULL;
t->r=NULL;
t->d=0;
}
else
{
if(x<t->data)
{
t->l=creat(t->l,x);
if(deep(t->l)-deep(t->r)==2)
{
if(x<t->l->data)
{
t=LL(t);
}
else
t=LR(t);
}
}
else
{
t->r=creat(t->r,x);
if(deep(t->l)-deep(t->r)==-2)
{
if(x>t->r->data)
t=RR(t);
else
t=RL(t);
}
}}
t->d=max(deep(t->l),deep(t->r))+1;
return t;
}
int main()
{
int n,i,x;
struct node*t=NULL;
scanf("%d",&n);
for(i=0;i<=n-1;i++)
{
scanf("%d",&x);
t=creat(t,x);
}
printf("%d\n",t->data);
return 0;
}
- 平衡二叉树平衡法则
- 二叉树--二叉平衡树
- 平衡二叉树的
- 平衡二叉树
- 平衡二叉树
- 平衡二叉树
- 平衡二叉树
- 平衡二叉查找树
- 平衡二叉树 详解
- 平衡二叉树
- 平衡二叉树
- AVL 平衡二叉树
- 平衡二叉树
- 平衡二叉树-红黑树
- 平衡二叉树
- 平衡二叉树
- 平衡二叉树
- 平衡二叉树
- 微盘链接信息
- <s:textfield></s:textfield>,<s:date>,<s:property>获取值
- ZabbixServer配置文件详解
- 【poj3608】 Bridge Across Islands
- Java多线程编程——对象及变量的并发访问 02
- 平衡二叉树
- [Java]1.运算符、流程控制、数组
- xcode下载
- popupwindow进入和退出动画
- 分布式集群运营管理系统-项目简介
- JavaScript验证码
- 优秀博客
- 《代码整洁之道》精读与演绎】之二 高质量代码的命名法则
- hud1756 Cupid's Arrow 计算几何