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

解释:

  平衡二叉树(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. 《Office 365开发入门指南教程》正式上线,限时优惠和邀请分享推广

    我很高兴地通知大家,<Office 365 开发入门指南教程>已经正式在网易云课堂上线,你可以通过直接访问  https://aka.ms/office365devlesson 这个短地址 ...

  2. vb.net 使用NPO自定義格式

    '導入命名空間 Imports System.IOImports NPOI.HSSF.UserModelImports NPOI.HPSFImports NPOI.POIFS.FileSystem P ...

  3. python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  4. Integer Partition(hdu4658)2013 Multi-University Training Contest 6 整数拆分二

    Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  5. awk、nawk、mawk、gawk的简答介绍

    awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出(即管道).它支持用户自定义函数和 动态正则表达式等先进功能,是linu ...

  6. react children

    children react 中,属性名是一一对应的,除了children. 对于一个组件来说,其this.props.children拿到的是什么呢???举个

  7. laravel常见异常解决

    requested URL not found http://stackoverflow.com/questions/21458080/the-requested-url-projectname-us ...

  8. js的map遍历和array遍历

    1. array遍历: [1].forEach() forEach是ES5中操作数组的一种方法,主要功能是遍历数组.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第 ...

  9. 洛谷P5205 【模板】多项式开根(多项式sqrt)

    题意 题目链接 Sol 这个就很没意思了 求个ln,然后系数除以2,然后exp回去. #include<bits/stdc++.h> #define Pair pair<int, i ...

  10. 洛谷P4726 【模板】多项式指数函数(多项式exp)

    题意 题目链接 Sol 多项式exp,直接套泰勒展开的公式 \(F(x) = e^{A(x)}\) 求个导\(F'(x) = A(x)\) 我们要求的就是\(G(f(x)) = lnF(x) - A( ...