【数据结构】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为根节点的子树做一次右单旋。

相关推荐
学不动CV了2 小时前
数据结构---线性表理解(一)
数据结构
ysa0510303 小时前
数论基础知识和模板
数据结构·c++·笔记·算法
今天背单词了吗9804 小时前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
气质、小青年!4 小时前
【排序算法】
c语言·数据结构
clock的时钟6 小时前
暑期数据结构第一天
数据结构·算法
小小小小王王王6 小时前
求猪肉价格最大值
数据结构·c++·算法
SuperW8 小时前
数据结构——队列
数据结构
??tobenewyorker9 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
让我们一起加油好吗9 小时前
【基础算法】贪心 (二) :推公式
数据结构·数学·算法·贪心算法·洛谷
蓝澈11219 小时前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构