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

相关推荐
一直C6 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
淡海水6 小时前
04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构
数据结构·算法·c#·哈希算法·编译·字典·dictionary
疯狂打码的少年7 小时前
【数据结构】板块总结 + 下期预告(数据库技术)
数据结构·笔记·算法
郝学胜-神的一滴7 小时前
Effective Python 条款 1:确认你正在使用的 Python 版本
开发语言·数据结构·python·程序人生·算法
dtq04249 小时前
数据结构 - 线性表 - 单链表
数据结构
1000世界小札9 小时前
排序算法全景总结:从 O(n²) 到 O(n log n),再到线性时间(附完整对比与选型指南)
数据结构·算法·排序算法
玉树临风ives10 小时前
atcoder ABC 472 题解
数据结构·c++·算法
李可以量化11 小时前
Redis Client 从入门到精通(一)下:redis-py 核心数据结构操作与连接管理
数据结构·redis·python·bootstrap·量化交易·qmt
疯狂打码的少年11 小时前
【数据结构】复习日:树 + 图 + 排序(整理对比表)
数据结构·笔记·算法