数据结构【查找】—平衡二叉树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是一个"加上了额外 ...
随机推荐
- 十大经典排序算法详细总结(含JAVA代码实现)
原文出处:http://www.cnblogs.com/guoyaohua/p/8600214.html 0.排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序. 0.2 术语说明 ...
- 注解@CrossOrigin解决跨域问题
注解@CrossOrigin 出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源.例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站.来自EVILL的脚本不能 ...
- Winform系列——好看的DataGridView折叠控件
来园子几年了,第一次写博客.以前看到别人的博客就在想:这些人怎么能有这么多时间整理这么多知识,难道他们不用工作.不用写代码.不用交付测试?随着工作阅历的增加,发现其实并不是时间的问题,关键一个字:懒. ...
- 用Vue.js搭建一个小说阅读网站
目录 1.简介 2.如何使用vue.js 3.部署api服务器 4.vue.js路由配置 5.实现页面加载数据 6.测试vue项目 7.在正式环境部署 8.Vue前端代码下载 1.简介 这是一个使用v ...
- C#一个窗体调用另一个窗体的方法
一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static FormA m_formA; //设此窗体为静态,其他窗体可调用此 ...
- Android开发过程中的坑及解决方法收录(二)
bug 1: bug描述: 无法成功地将edittext中的内容传入数据库中 bug动图: 经过: 最近写了个项目,项目要使用到SQL数据库,由于没有相关知识,便是找到了各种资料开始了自学之旅,在de ...
- Java从URL获取PDF内容
Java直接URL获取PDF内容 题外话 网上很多Java通过pdf转 HTML,转文本的,可是通过URL直接获取PDF内容,缺没有,浪费时间,本人最近工作中刚好用到,花了时间整理下,分享出来,防止浪 ...
- CommandLineRunner和ApplicationRunner的区别
CommandLineRunner和ApplicationRunner的区别 二者的功能和官方文档一模一样,都是在Spring容器初始化完毕之后执行起run方法 不同点在于,前者的run方法参数是St ...
- hive SQL查询结果添加行号
用窗口函数可以解决这个问题: 例:select row_number() over(order by user_id desc) ,tab.* from dws_user_visit_month1 a ...
- 洛谷P2286 [HNOI2004]宠物收养场
题目描述 凡凡开了一间宠物收养场.收养场提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物. 每个领养者都希望领养到自己满意的宠物,凡凡根据领养者的要求通过他自己发明的一个特殊的公式,得出该领 ...