数据结构【查找】—平衡二叉树AVL
/*自己看了半天也没看懂代码,下次再补充说明*/
解释:
平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1。
实现原理:
平衡二叉树构建的基本思想就是在构建二又排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二又排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
右旋:

左旋:

左旋、右旋:

代码实现:
#include "000库函数.h" #define MAXSIZE 100//
#define EH 0
#define LH +1 //左高
#define RH -1 //右高 //二叉树的结构
struct BiTree
{
int data;
int bf;//AVL的平衡因子
BiTree *lchild, *rchild;
}; bool L_Rotate(BiTree* &T) {//对T的左子树作左旋平衡处理
BiTree *R;
R = T->rchild;
T->rchild = R->lchild;//R的左子树挂接为T的右子树
R->lchild = T;
T = R;
return true;
} bool R_Rotate(BiTree* &T) {//对T做右旋处理
BiTree *L;
L = T->lchild;
T->lchild = L->rchild;
L->rchild = T;
T = L;
return true;
} //判断再加入左子树会不会打破平衡
bool LeftBalace(BiTree* &T) {//如今再添加进左边就应该添加后判断是否打破了平衡
BiTree *L, *Lr;
L = T->lchild;
switch (L->bf)//判断左子树的平衡因子
{
case LH://原为左增,现再增加就打破平衡了,故需要做右旋处理
T->bf = L->bf = EH;
R_Rotate(T);
break;
case RH://原节点为右增,再增加左节点(深度+1),就打破平衡了,故作双旋处理
Lr = L->rchild;
switch (Lr->bf)
{
case LH:
T->bf = RH;
L->bf = EH;
break;
case EH:
T->bf = L->bf = EH;
break;
case RH:
T->bf = EH;
L->bf = LH;
break;
default:
break;
}
Lr->bf = EH;
L_Rotate(T->lchild);//对T的左子树作左旋平衡处理
R_Rotate(T);//对T做右旋处理
break;
default:
break;
}
return true;
} //判断再加入右子树会不会打破平衡
bool RightBalace(BiTree* &T) {//如今再添加进右边就应该添加后判断是否打破了平衡
BiTree *R, *Rl;
R = T->rchild;
switch (R->bf)//判断右子树的平衡因子
{
case LH://原节点为左增,再增加右节点(深度+1),就打破平衡了,故作双旋处理
Rl = R->lchild;
switch (Rl->bf)
{
case LH:
T->bf = EH;
R->bf = RH;
break;
case EH:
T->bf = R->bf = EH;
break;
case RH:
T->bf = LH;
R->bf = EH;
break;
default:
break;
}
Rl->bf = EH;
R_Rotate(T->rchild);//对T的左子树作左旋平衡处理
L_Rotate(T);//对T做右旋处理
break;
case RH://原为右增,现再增加就打破平衡了,故需要做左旋处理
T->bf = R->bf = EH;
L_Rotate(T);
break;
default:
break;
}
return true;
} //AVL创建
/* 若在平衡的二叉排序树T中不存在和e有相同关键字的结点,则插入一个 */
/* 数据元素为e的新结点,并返回1,否则返回0。若因插入而使二叉排序树 */
/* 失去平衡,则作平衡旋转处理,布尔变量taller反映T长高与否。 */
bool InsertAVL(BiTree * &T, int elem, bool &n) {
if (T == NULL) {
BiTree *p;
p = new BiTree;
p->data = elem;
p->bf = EH;
p->lchild = NULL;
p->rchild = NULL;
T = p;
n = true;
return true;
}
if (T->data == elem) {//数据已存在,不需要再添加
n = false;
return false;
}
if (elem < T->data) {
if (!(InsertAVL(T->lchild, elem, n)))//应当继续在左子树中继续查找
return false;//添加失败
if (n) {//添加成功
switch (T->bf)//检查AVL的平衡因子
{
case LH://原树左边高
LeftBalace(T);//如今再添加进左边就应该添加后判断是否打破了平衡
n = false;
break;
case EH://原树左等高度,那就加入其左边,让其增高
T->bf = LH;
n = true;
break;
case RH://原树右端高,那就加入左端,抵消有右边的高度
T->bf = EH;
n = false;
break;
default:
break;
}
}
}
else {
if (!(InsertAVL(T->rchild, elem, n)))//应当继续在右子树中继续查找
return false;//添加失败
if (n) {//添加成功
switch (T->bf)//检查AVL的平衡因子
{
case LH://原树左边高
T->bf = EH;//加入右端,抵消有左边的高度
n = false;
break;
case EH://原树左等高度,那就加入其右边,让其增高
T->bf = LH;
n = true;
break;
case RH://原树右端高
RightBalace(T);//如今再添加进右边就应该添加后判断是否打破了平衡
n = false;
break;
default:
break;
}
}
} }
//遍历AVL
void ShowTree(BiTree *T) {
//进行中序浏览
if (T) {
ShowTree(T->lchild);
cout << T->data << "—>";
ShowTree(T->rchild);
}
} int T033(void)
{
int i;
int a[] = { ,,,,,,,,, };
BiTree *T = new BiTree;
T = NULL;
bool taller;//用来判断AVL是否增加了深度
BiTree *p;
for (i = ; i < ; i++) {
InsertAVL(T, a[i], taller);
if (i == )p = T;//记住头结点
}
ShowTree(T);
cout << endl;
return ;
}
数据结构【查找】—平衡二叉树AVL的更多相关文章
- 【数据结构】平衡二叉树—AVL树
(百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...
- 数据结构与算法--从平衡二叉树(AVL)到红黑树
数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...
- 数据结构之平衡二叉树(AVL树)
平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ...
- 数据结构(六)查找---平衡二叉树(ASL)
前提 我们之前的二叉排序树的插入(构建)是按照我们输入的数据来进行的,若是我们的数据分布不同,那么就会构造不同的二叉树 { , , , , , , , , , } { , , , , , , , , ...
- 数据结构和算法(Golang实现)(28)查找算法-AVL树
AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...
- 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)
二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...
- 平衡二叉树AVL - 插入节点后旋转方法分析
平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 首先我们知道,当插入一个节点,从此插入点到树根 ...
- 二叉查找树、平衡二叉树(AVL)、B+树、联合索引
1. [定义] 二叉排序树(二拆查找树)中,左子树都比节点小,右子树都比节点大,递归定义. [性能] 二叉排序树的性能取决于二叉树的层数 最好的情况是 O(logn),存在于完全二叉排序树情况下,其访 ...
- Java 树结构实际应用 四(平衡二叉树/AVL树)
平衡二叉树(AVL 树) 1 看一个案例(说明二叉排序树可能的问题) 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在. 左边 BST 存在的问题分析: ...
- 数据结构与算法——AVL树类的C++实现
关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外 ...
随机推荐
- 怎么将XML字符串转换为XmlDocument,并获取部分节点值
我们的目标:解析XML字符串,并获取节点:z:row下的属性:ows_LinkFilename的值集合??? XML字符串数据结构如下: <listitems xmlns:s='uuid:BDC ...
- WPF TextBlock IsTextTrimmed 判断文本是否超出
WPF TextBlock/TextBox 设置TextTrimming情况下 判断 isTextTrimmed(Text 文本是否超出 是否出现了省略号) private bool IsTextTr ...
- ASP.NET MVC3 在_ViewStart设置Layout使用RenderAction的注意事項
来源:https://dotblogs.com.tw/lastsecret/archive/2012/03/26/71052.aspx ASP.NET MVC3 在_ViewStart設定Layout ...
- springMVC_04controller四种配置总结
一.通过url对应bean,加粗部分为必须有的 <bean class=" org.springframework.web.servlet.handler.BeanNameUrlHan ...
- Eclipse中SVN插件的安装和配置(在线安装)
公司项目中用到了svn来管理项目,然后需要在Eclipse中进行配置.网上参考了很多资料,离线安装的方式装上了,但是导入项目后报错,可能是离线安装包的问题.然后又采用了Eclipse在线安装的方式,总 ...
- 10个用Console来Debug的高级技巧
译者按: 我们往往会局限在自己熟悉的知识圈,但也应担偶尔拓展一下,使用一些不常见而又有用的技巧,扩大自己的舒适圈. 原文: 10 Tips for Javascript Debugging Like ...
- 枚举getClass、getDeclaringClass区别
枚举getClass.getDeclaringClass区别 1):“不含抽象方法”,所有枚举常量未重写方法,的class getClass与getDeclaringClass方法输出结果相同 cla ...
- mac node版本管理
(0)简说 目前有n和nvm这两个工具可以对Node进行升级,以下简单介绍一下二者的使用. (1)n 安装很简单: $ sudo npm install -g n 另一种获取源码的方法安装: $ gi ...
- 学习 Docker 操作系统版本选择
近来有时间一直在捣鼓 Docker.因为服务器选择的是 CentOS 版本,所以实验的环境选择的一直是 CentOS.如果是个人玩 Docker,优先选择 ubuntu.如果需要选择 CentOS 的 ...
- iPhone X手机投屏电脑无线连接教程
iPhone X手机是一款非常有气场的手机,独特的设计,展现手机的独特魅力,手机外观让人一眼就爱上,手感也是超级的舒适,真的是堪称完美,但是iPhone X手机投屏电脑怎么无线连接呢? 使用工具: 电 ...