算法与数据结构——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,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是.增 ...
随机推荐
- 16.java八皇后问题
问题描述:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 .同一列或同一斜线上,问有多少种摆法(92). 思路分析:1) 第一个皇后先放第一行第一列2) ...
- 虚拟机搭建linux环境&&使用winscp连接搭建好的linux环境步骤
一.需要的工具 虚拟机应用程序.一个镜像(ubuntu等).winscp可执行程序 二.安装虚拟机以及插入镜像 1)选择虚拟机 我安装的是VMware 就是这个,因为之前用的都是vitualbox现在 ...
- vue3 门户网站搭建5-图标
奈何 element 自带的图标太少,不够用,故打算使用 vite-plugin-svg-icons 组件来封装 svg-icon . ps: ui 框架选用的 element-ui,为了能跟 vue ...
- HashMap问题
package com.google; import javax.lang.model.element.NestingKind; import java.util.HashMap; public cl ...
- 用FineBI实现hive图表的可视化
图表的可视化,本来我以为很麻烦,因为看着图就感觉很难的样子,其实用FineBI来做很简单. 1.安装FineBI 2将下列jar包导入FineBI,webapps\webroot\WEB-INF\li ...
- git bash 笔记
下载和安装 官网下载地址:https://git-scm.com/ 国内镜像下载地址:https://registry.npmmirror.com/binary.html?path=git-for-w ...
- Vue中v-if和v-for一起使用时的优先级
问题:Vue2.0中v-if和v-for一起使用时报错,怎么解决呢? 代码和报错信息如下 原因和解决办法: 在处于同一节点的时候,v-for 优先级比 v-if 高.这意味着 v-if 将分别重 ...
- profile2的原理猜想
1, profile2 是一个 entity_type, 可以包含fields, 每个用户都对应一个profile的id, 其实就是type id, 就相当于bundle, 所谓的函数profile ...
- CF1548B Integers Have Friends
洛咕 题意: 给定 \(n\) 和一个长度为 \(n\) 的数组 \(a\),求一个最长的区间 \(\left[l,r\right]\),使得存在 \(m\geq 2\) 和 \(k\),对于所有 \ ...
- ubuntu 逻辑卷增加磁盘
使用lv* 相关的命令 lvdisplay lvscan ACTIVE '/dev/ubuntu-vg/ubuntu-lv' [<74.00 GiB] inherit lv ...