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

相关推荐
地球资源数据云24 分钟前
1951-2025年中国逐年1千米逐月总降水量区域统计数据集_年表_县
大数据·数据结构·数据库·数据仓库·人工智能
cpp_25012 小时前
P2639 [USACO09OCT] Bessie‘s Weight Problem G
数据结构·算法·动态规划·题解·洛谷·背包dp
郝学胜-神的一滴2 小时前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
菜鸟丁小真2 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
数智化精益手记局3 小时前
8d报告案例分析:拆解8d报告案例分析的8个步骤,解决生产现场重复发生的质量难题
大数据·数据结构·数据库·人工智能·精益工程
笨笨饿3 小时前
66_C语言与微控制器底层开发
linux·c语言·网络·数据结构·算法·机器人·个人开发
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题】【Java基础篇】第10题:HashMap中的元素是有序存放的吗
java·开发语言·数据结构·后端·面试·哈希算法·哈希表
牢姐与蒯4 小时前
c++数据结构之二叉搜索树
数据结构·c++·搜索
会编程的土豆4 小时前
【数据结构与算法】新二叉树
数据结构·算法·二叉树
Morwit4 小时前
【力扣hot100】 416. 分割等和子集
数据结构·c++·算法·leetcode·职场和发展