算法与数据结构——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,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
随机推荐
- #pragma directive
#pragma package(smart_init) #pragma package(smart_init)确保已打包的单元按照其依赖关系确定的顺序进行初始化(默认情况下包含在package(包)源 ...
- dockerfile配置远程ssh登录
1.dockerfile FROM ubuntu:20.04 RUN DEBIAN_FRONTEND="noninteractive" apt-get update &&a ...
- Ginan-PEA例程下载
输入以下命令可在Ubuntu系统中进行下载,但受到网络限制并不能有效下载或者下载很慢 python3 scripts/download_examples.py 通过阅读python脚本,可将下载网址拷 ...
- mysql企业常用集群架构
转自 https://blog.csdn.net/kingice1014/article/details/76020061 1.mysql企业常用集群架构 在中小型互联网的企业中.mysql的集群一般 ...
- 嵌入式Linux应用开发
3-4 Makefile常用的函数 i. $(foreach var,list,text) 简单地说,就是 for each var in list, change it to text. 对lis ...
- String和StringBuffer与StringBuilder的区别
1.String.StringBuffer.StringBuilder都不可以被继承,在JDK中它们都被定义为final类. 2.执行速度:StringBuilder > StringBuffe ...
- spring security 基于角色的控制,可运行。
基于角色的访问控制 建表语句,见 上一篇 的博文, https://www.cnblogs.com/sdgtxuyong/p/16157870.html 在配置类中,@EnableGlobalMet ...
- Android NDK build vsomeip3
Build Boost for Android https://github.com/moritz-wundke/Boost-for-Android set the NDK_ROOT environm ...
- linux 使用tc做限速
#!/bin/bash#针对不同的ip进行限速 #清空原有规则tc qdisc del dev em3 root #创建根序列tc qdisc add dev em3 root handle 1: h ...
- 图像bayer格式介绍
图像bayer格式介绍 https://zhuanlan.zhihu.com/p/72581663