*平衡二叉树基本操作*
2016-08-11 20:53
162 查看
{
int data;
int d;
struct bitnode *lchild, *rchild;
}* bitree;
int deep(bitree &t)//求结点的高度,左右子树相减即为平衡因子
{
if(!t)
return -1;
return t->d;
}
x的lchild连上a的rchild,a的rchild连上x,完成旋转。
bitree LL(bitree &t) //单旋转
{
bitree q;
q = t->lchild;
t->lchild = q->rchild;
q->rchild = t;
q->d = max(deep(q->lchild), deep(q->rchild))+1;
t->d = max(deep(t->lchild), deep(t->rchild))+1;//旋转之后更新结点的高度
return q;
}
x的rchild连上a的lchild,a的lchild连上x,完成旋转。
bitree RR(bitree &t)//单旋转
{
bitree q;
q = t->rchild;
t->rchild = q->lchild;
q->lchild = t;
q->d = max(deep(q->lchild), deep(q->rchild))+1;
t->d = max(deep(t->lchild), deep(t->rchild))+1;
return q;
}
旋转分两步:1.以a为根结点的RR旋转 2.以x为根结点的LL旋转 。
bitree LR(bitree &t)
{
t->lchild = RR(t->lchild);
return LL(t);
}
旋转分两步:1.以a为根结点的LL旋转 2.以x为根结点的RR旋转 。
bitree RL(bitree &t)
{
t->rchild = LL(t->rchild);
return RR(t);
}
bitree Insert(bitree &t, int x) //构造平衡二叉树
{
if(!t)
{
t = new bitnode;
t->lchild = NULL;
t->rchild = NULL;
t->data = x;
t->d = 0;
}
else if(x<t->data)
{
t->lchild = Insert(t->lchild, x);
if(deep(t->lchild)-deep(t->rchild)>1)
{
if(x<t->lchild->data)
t = LL(t);
else
t = LR(t);
}
}
else if(x>t->data)
{
t->rchild = Insert(t->rchild, x);
if(deep(t->rchild)-deep(t->lchild)>1)
{
if(x>t->rchild->data)
t = RR(t);
else
t = RL(t);
}
}
t->d = max(deep(t->lchild), deep(t->rchild))+1;//每建一个节点将高度更新一遍
return t;
}
相关文章推荐
- ADO.NET详细研究(四)--实例演示DataReader基本操作
- BIO系列之3---BIO的声明和释放等基本操作
- 数据库基本操作
- MYSQL安装与基本操作
- 矩阵基本操作的实现(C# 源代码)
- C#应用程序控制Word文档操作-基本
- SQL的基本操作
- C#中对XML文件的一些基本操作
- DataGrid Web Control 基本操作
- 开始把准备把Exchange的一些基本操作和设置与SharePoint结合起来
- 利用System.IO中的Directory类对目录进行基本操作
- 树的基本操作
- C#中对XML文件的一些基本操作
- java 数据库基本操作
- 开始把准备把Exchange的一些基本操作和设置与SharePoint结合起来
- SQL的基本操作
- 实例介绍文件下载,注册表操作等基本技巧!(原创)
- 1、java数据库操作基本流程
- (转载)SoftIce的安装、配置以及一些基本操作
- 对XML文件的基本操作