数据结构【查找】—平衡二叉树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是一个"加上了额外 ...
随机推荐
- centos7修改网卡名称为eth0-技术流ken
前言 在配置集群的时候,需要保持网卡名称一致,所以我们需要修改centos7中的网卡名称为eth0. 检查网卡 检查网卡,现在网卡名称是ens33 [root@localhost ~]# ip a : ...
- 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一)
转发时请注明原创作者及地址,否则追究责任. 原创:alunchen 当创建AspNetCore项目时 当我们创建一个AspNetCore项目时,需要我们手动添加Log: services.AddLog ...
- [转]Docker php extensions gd
本文转自:https://docs.docker.com/samples/library/php/ How to use this image Create a Dockerfile in your ...
- SET XACT_ABORT ON是什么?
避免自己遗忘,在这里做个笔记: SET XACT_ABORT ON:强制事务回滚,如果不加这句的话事务有可能回滚失败.
- Transact-SQL解析和基本的实用语句
SQL语言 DDL(数据定义语句) DML(数据操作语句) DCL(数据控制语句) DDL 数据定义 操作对象 操作方式 创建 删除 修改 模式 CREATE SCHEMA DROP SCHEMA 表 ...
- echarts X轴显示不全 有省略
代码如下: xAxis: [ { type: 'category', data: result.weekListAndYear,//result.weekList, axisLabel:{ // in ...
- mysql外键使用
一.外键 .外键:链接两张表的字段,通过主表的主键和从表的外键来描述主外键关系,呈现的是一对多的关系.例如:商品类别(一)对商品(多),主表:商品类别表,从表:商品表. .外键的特点:从表外键的值是对 ...
- 面试官:你分析过mybatis工作原理吗?
Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...
- BZOJ3453: tyvj 1858 XLkxc(拉格朗日插值)
题意 题目链接 Sol 把式子拆开,就是求这个东西 \[\sum_{i = 0} ^n \sum_{j = 1}^{a + id} \sum_{x =1}^j x^k \pmod P\] 那么设\(f ...
- Salesforce 数据备份和恢复小知识
数据备份的类型 在Salesforce中可以使用多种API进行数据备份,它们是: REST API SOAP API Buik API Metadata API 数据备份有三种选择: 完全备份(Ful ...