算法与数据结构——AVL树(平衡二叉树)
定义
typedef struct AVLNode* Position;
typedef Position AVLTree; /* AVL树类型 */
struct AVLNode {
ElementType Data; /* 结点数据 */
AVLTree Left; /* 指向左子树 */
AVLTree Right; /* 指向右子树 */
int Height; /* 树高 */
};
前期准备函数
int Max(int a, int b)
{
return a > b ? a : b;
}
int GetHeight(Position T)
{
int hr, hl;
if (!T)
{
return 0;
}
hl = GetHeight(T->Left);
hr = GetHeight(T->Right);
return (hl > hr) ? ++hl : ++hr;
}
实现功能的主要函数
调整函数
Position SingleRoateWithLeft(Position A)
{
Position B;
B = A->Left;
A->Left = B->Right;
B->Right = A;
A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;
B->Height = Max(GetHeight(B->Left), GetHeight(B->Right)) + 1;
return B;//new node
}
//右单旋
Position SingleRoateWithRight(Position A)
{
Position B;
B = A->Right;
A->Right = B->Left;
B->Left = A;
A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;
B->Height = Max(GetHeight(B->Left), GetHeight(B->Right)) + 1;
return B;
}
//右左双旋
Position DoubleRoateWithLeft(Position A)
{
A->Left = SingleRoateWithRight(A->Left);
return SingleRoateWithLeft(A);
}
//左右双旋
Position DoubleRoateWithRight(Position A)
{
A->Right = SingleRoateWithLeft(A->Right);
return SingleRoateWithRight(A);
}
插入函数(兼具建树功能)
AVLTree Insert(ElementType X, AVLTree T)
{
if (T == NULL)
{
T = new AVLNode;
T->Data = X;
T->Left = T->Right = NULL;
T->Height = 0;
}
else if (X < T->Data)
{
T->Left = Insert(X, T->Left);
if (GetHeight(T->Left) - GetHeight(T->Right) == 2)
{
if (X < T->Left->Data)
{
T = SingleRoateWithLeft(T);
}
else
{
T = DoubleRoateWithLeft(T);
}
}
}
else
{
T->Right = Insert(X, T->Right);
if (GetHeight(T->Right) - GetHeight(T->Left) == 2)
{
if (X > T->Right->Data)
{
T = SingleRoateWithRight(T);
}
else
{
T = DoubleRoateWithRight(T);
}
}
}
T->Height = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
return T;
}
删除函数
删除函数和插入函数很像,删除的情况要考虑好。图解参考
AVLTree Delete(ElementType X, AVLTree T)
{
if (T == NULL)
{
return NULL;
}
if (X < T->Data)
{
T->Left = Delete(X, T->Left);
}
else if (X > T->Data)
{
T->Right = Delete(X, T->Right);
}
else
{
if (T->Left)
{
AVLTree tmp= FindMax(T->Left);
T->Data = tmp->Data;
T->Left = Delete(tmp->Data, T->Left);
}
else if (T->Right)
{
AVLTree tmp = FindMin(T->Right);
T->Data = tmp->Data;
T->Right = Delete(tmp->Data, T->Right);
}
else
{
free(T);
return NULL;
}
}
if (GetHeight(T->Left) - GetHeight(T->Right) == 2)
{
if (GetHeight(T->Left->Left)>GetHeight(T->Left->Right))
{
T = SingleRoateWithLeft(T);
}
else
{
T = DoubleRoateWithLeft(T);
}
}
else if (GetHeight(T->Right) - GetHeight(T->Left) == 2)
{
if (GetHeight(T->Right->Right) > GetHeight(T->Right->Left))
{
T = SingleRoateWithRight(T);
}
else
{
T = DoubleRoateWithRight(T);
}
}
T->Height = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1;
return T;
}
其他函数
VLTree MakeEmpty(AVLTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
Position Find(ElementType X, AVLTree T)
{
if (T == NULL)
{
return NULL;
}
if (X < T->Data)
{
return Find(X,T->Left);
}
else if(X>T->Data)
{
return Find(X, T->Right);
}
else
{
return T;
}
}
Position FindMin(AVLTree T)
{
if (T == NULL)
{
return NULL;
}
else if(T->Left==NULL)
{
return T;
}
else
{
return FindMin(T->Left);
}
}
Position FindMax(AVLTree T)
{
if (T == NULL)
{
return NULL;
}
else if(T->Right==NULL)
{
return T;
}
else
{
return FindMax(T->Right);
}
}
深度和高度
void showHeight(int a,Position T)
{
if (T == NULL)
{
return;
}
showHeight(a,T->Left);
cout << T->Height << ' ';
showHeight(a,T->Right);
}
void showdeep(int depth,Position T)
{
if (T == NULL) return;
if (T)
{
showdeep(depth + 1, T->Left);
cout << depth+1<<' ';
showdeep(depth + 1, T->Right);
}
}
算法与数据结构——AVL树(平衡二叉树)的更多相关文章
- 数据结构树之AVL树(平衡二叉树)
一 什么是AVL树(平衡二叉树): AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.在AVL树中任何节 ...
- Java数据结构——AVL树
AVL树(平衡二叉树)定义 AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,并且拥有自平衡机制.在AV ...
- 转:红黑树和AVL树(平衡二叉树)区别
本文转载至链接:https://blog.csdn.net/u010899985/article/details/80981053 一.AVL树(平衡二叉树) (1)简介 AVL树是带有平衡条件的二叉 ...
- 数据结构与算法(九):AVL树详细讲解
数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希 ...
- 数据结构-AVL树的旋转
http://blog.csdn.net/GabrieL1026/article/details/6311339 平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树,它 ...
- 树·AVL树/平衡二叉树
1.AVL树 带有平衡条件的二叉查找树,所以它必须满足条件: 1 是一棵二叉查找树 2 满足平衡条件 1.1 平衡条件: 1)严格的平衡条件:每个节点都必须有相同高度的左子树和右子树(过于严格而不被使 ...
- 第三十二篇 玩转数据结构——AVL树(AVL Tree)
1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...
- 数据结构 - AVL 树
简介 基本概念 AVL 树是最早被发明的自平衡的二叉查找树,在 AVL 树中,任意结点的两个子树的高度最大差别为 1,所以它也被称为高度平衡树,其本质仍然是一颗二叉查找树. 结合二叉查找树,AVL 树 ...
- 简单数据结构———AVL树
C - 万恶的二叉树 Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:32768KB 64b ...
- JAVA数据结构--AVL树的实现
AVL树的定义 在计算机科学中,AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
随机推荐
- mysql 创建函数失败解决办法,版本 8.0.26
报错信息:[Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declarat ...
- log4j2.xml配置全部正确,但是控制台不能输出错误日志
如果配置文件,确定都没有问题,那么可能是Logger的包引入的不对: private static Logger logger = LogManager.getLogger(TrainControll ...
- pytorch的三种量化方式详解
pytorch的三种量化方式详解 这篇博客详细介绍了pytorch官方教程提到的三种量化方式的原理,详细解释了三种量化方式的区别: 1. 静态量化 :torch.quantize_per_tensor ...
- ubuntu16.04编译LAPACK3.7.1出错
NEP: Testing Nonsymmetric Eigenvalue Problem routines ./EIG/xeigtstz < nep.in > znep.out 2> ...
- vue3 门户网站搭建3-pinia
引入 pinia 来方便处理全局变量. npm install pinia 1.创建 pinia 2.main 中引入(我这里是直接写的 index,所以导出的是 stores) 3.定义变量 使用: ...
- 【转载】VMWare 各版本下载地址【centos7安装gerrit】
https://blog.csdn.net/weixin_44129085/article/details/110443135 centos7安装gerrit https://blog.csdn.ne ...
- eFuse技术
1. 基本概况及介绍 不同于大多数FPGA使用的SRAM阵列,eFuse一次只有一根熔丝能够被编程,这是该方法的配置能力存在限制范围的原因.但当与日益成熟的内置自测试(BIST)引擎组合使用时,这 ...
- python中的KeyError报错
from util import str_util #业务逻辑:兼容不同的结构体:resCode转化数据 #检查字典中是否存在键 if 'resCode' not in resultJson if ' ...
- py06
元祖tuple 与列表类似可以存多个值,但是不同的是元祖本身不能被修改 #一:基本使用:tuple# 1 用途:记录多个值,当多个值没有改的需求,此时用元组更合适 # 2 定义方式:在()内用逗号分隔 ...
- 在windows 7下构建 FTP 服务器
首先我们在C盘建立两个文件夹,用于发ftp的上传和下载 其次我们找到控制面板>程序>打开或关闭windows功能 进入后找到Internet 信息服务>FTP服务器>确定! 选 ...