/*自己看了半天也没看懂代码,下次再补充说明*/

解释:

  平衡二叉树(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的更多相关文章

  1. 【数据结构】平衡二叉树—AVL树

    (百度百科)在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  2. 数据结构与算法--从平衡二叉树(AVL)到红黑树

    数据结构与算法--从平衡二叉树(AVL)到红黑树 上节学习了二叉查找树.算法的性能取决于树的形状,而树的形状取决于插入键的顺序.在最好的情况下,n个结点的树是完全平衡的,如下图"最好情况&q ...

  3. 数据结构之平衡二叉树(AVL树)

    平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ...

  4. 数据结构(六)查找---平衡二叉树(ASL)

    前提 我们之前的二叉排序树的插入(构建)是按照我们输入的数据来进行的,若是我们的数据分布不同,那么就会构造不同的二叉树 { , , , , , , , , , } { , , , , , , , , ...

  5. 数据结构和算法(Golang实现)(28)查找算法-AVL树

    AVL树 二叉查找树的树高度影响了查找的效率,需要尽量减小树的高度,AVL树正是这样的树. 一.AVL树介绍 AVL树是一棵严格自平衡的二叉查找树,1962年,发明者Adelson-Velsky和La ...

  6. 二叉查找树(BST)、平衡二叉树(AVL树)(只有插入说明)

    二叉查找树(BST).平衡二叉树(AVL树)(只有插入说明) 二叉查找树(BST) 特殊的二叉树,又称为排序二叉树.二叉搜索树.二叉排序树. 二叉查找树实际上是数据域有序的二叉树,即对树上的每个结点, ...

  7. 平衡二叉树AVL - 插入节点后旋转方法分析

    平衡二叉树 AVL( 发明者为Adel'son-Vel'skii 和 Landis)是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 首先我们知道,当插入一个节点,从此插入点到树根 ...

  8. 二叉查找树、平衡二叉树(AVL)、B+树、联合索引

    1. [定义] 二叉排序树(二拆查找树)中,左子树都比节点小,右子树都比节点大,递归定义. [性能] 二叉排序树的性能取决于二叉树的层数 最好的情况是 O(logn),存在于完全二叉排序树情况下,其访 ...

  9. Java 树结构实际应用 四(平衡二叉树/AVL树)

    平衡二叉树(AVL 树) 1 看一个案例(说明二叉排序树可能的问题) 给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在.  左边 BST 存在的问题分析: ...

  10. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外 ...

随机推荐

  1. 业务开发(一)—— MySQL

    0x01.SQL异常Incorrect string value java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9 ...

  2. 怎么将XML字符串转换为XmlDocument,并获取部分节点值

    我们的目标:解析XML字符串,并获取节点:z:row下的属性:ows_LinkFilename的值集合??? XML字符串数据结构如下: <listitems xmlns:s='uuid:BDC ...

  3. tomcat中 server.xml

    tomcat服务器, 配置文件server.xml中的各项配置的意义 <?xml version="1.0" encoding="UTF-8"?> ...

  4. 3;XHTML排列清单控制标记

    1.无序号条例式清单<ul> 2.有序号条例式清单<ol> 3.无序列表和有序列表的结合应用 4.叙述式清单<dl> 排列清单控制标记可以创建一般的列表.编号列表或 ...

  5. Android Studio--gradle:download 过慢甚至超时timeout报错

    问题描述 今天第一次学习安卓,配置环境花了不少时间其他都比较容易的解决了 gradle 因为会从外国的网站下载东西会非常的慢(具体原理我也不清楚),所以最好让下载地址变成国内的 解决方案(最后有升级方 ...

  6. leetcode-58.最后一个单词的长度

    leetcode-58.最后一个单词的长度 题意 给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但 ...

  7. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  8. Windows桌面或服务器环境下嵌入JavaScript支持(JSRT)

    很多人比较关注Google的JS V8 JavaScript引擎,确实Google最近很高调.但这个库在Windows下使用确实有点难度,即使在Linux嵌入,也需要下载gyp,编译安装,然后再下载v ...

  9. Orchard详解--第四篇 缓存介绍

    Orchard提供了多级缓存支持,它们分别是: 1. 应用程序配置级缓存ICacheManager: 它用来存储应用程序的配置信息并且可以提供一组可扩展的参数来处理缓存过期问题,在Orchard中默认 ...

  10. The content of element type "package" must match "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?,default-class-ref?,global- results?,global-exception-mappings?,action*)".

    报错 The content of element type "package" must match "(result-types?,interceptors?,def ...