【数据结构】19 平衡二叉树

定义

平衡二叉树又称为AVL树,是具有以下性质的非空搜索树:

  1. 任一结点的左、右子树均为AVL树。
  2. 根节点的左、右子树高度差的绝对值不超过1.

对于二叉树的任一结点T,其平衡因子(BF)定义为BF(T)= h L − h R h_L- h_R hL−hR, h L h_L hL和 h R h_R hR分别是T的左、右子树的高度。故AVL树的平衡因子只能在{-1,0,1}中取值。

平衡树的调整

当向一颗AVL树插入新的结点时,该节点的平衡因子可能不在上述集合分为内。 这时需要做出"平衡化"处理,即相应的局部旋转调整,时调整后的树达到平衡。

单旋调整

右单旋(RR)

如图,在第三个节点插入后,根节点mar的平衡因子为-2,树不平衡。需要将树做逆时针旋转。

#

一般情况如下图所示,在A的右节点B的右子树 里插入C,使得A的平衡因子变为-2,这时我们需要逆时针旋转相关节点,把B至于A的位置,A置为B的子节点。若B有左子树,将B的左子树置为A的右子树。

左单旋(LL)

一般情况下,在A节点的左节点B的左子树 下插入C节点后导致A节点不平衡,需要顺时针旋转相应节点,将B节点替代A节点位置,将A节点置为B的右节点,若B有右子树,则将B的右子树作为A的左节点。

双旋调整

LR型

在A节点的左节点B的右子树(以C为根节点)下插入D,称为LR型不平衡。调整方式为将C至于A的位置,A及其右子树调整为C的右子树,C的左子树作为B的右子树,C的右子树作为A的左子树。

事实上,这一调整也可以视为对以B节点为根的子树做一次右单旋,再对以A为根节点的子树做一次左单旋。

RL型

在A节点的右节点B的左子树(以C为根节点)下插入D,称为RL型不平衡。

调整方法为C替代A的位置,A以及A的左子树作为C的左子树,C的左子树为A 的右子树,C的右子树作为B 的左子树。

事实上,这一调整也可以视为对以B节点为根的子树做一次左单旋,再对以A为根节点的子树做一次右单旋。

相关推荐
ZoeJoy81 小时前
算法筑基(一):排序算法——从冒泡到快排,一文掌握最经典的排序算法
数据结构·算法·排序算法
承渊政道2 小时前
【优选算法】(实战体会位运算的逻辑思维)
数据结构·c++·笔记·学习·算法·leetcode·visual studio
承渊政道2 小时前
【优选算法】(实战推演模拟算法的蕴含深意)
数据结构·c++·笔记·学习·算法·leetcode·排序算法
历程里程碑4 小时前
Protobuf 环境搭建:Windows 与 Linux 系统安装教程
linux·运维·数据结构·windows·线性代数·算法·矩阵
代码探秘者5 小时前
【算法】吃透18种Java 算法快速读写模板
数据结构·数据库·python·算法·spring
WolfGang0073215 小时前
代码随想录算法训练营 Day21 | 回溯算法 part03
数据结构·算法
深邃-5 小时前
数据结构-队列
c语言·数据结构·c++·算法·html5
keep intensify6 小时前
二叉树的直径
数据结构·算法·深度优先
keep intensify6 小时前
单源最短路径
数据结构·c++·算法
篮l球场6 小时前
数组中的第K个最大元素
数据结构·算法·leetcode