news 2026/6/15 15:12:40

在平衡二叉树(AVL 树)中,双旋转和删除操作是维持树结构平衡的关键机制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在平衡二叉树(AVL 树)中,双旋转和删除操作是维持树结构平衡的关键机制

在平衡二叉树(AVL 树)中,双旋转和删除操作是维持树结构平衡的关键机制。当插入或删除节点导致树失衡时,需根据具体失衡类型进行相应的旋转调整。

1. 双旋转平衡处理

先左后右双旋转(LR 型)
  • 场景:节点 A 的平衡因子为 1(左子树高),在其左子树的右子树中插入新节点,使 A 的平衡因子变为 2,树失衡。
  • 操作步骤
    1. 对 A 的左子节点 B 的右子树进行左旋(即以 B 的右子树根节点 C 为轴向左旋转),将插入点“上提”,转化为 LL 型;
    2. 再对节点 A 进行右旋,恢复整体平衡。
  • 本质:通过两次旋转将插入引发的“折线型”不平衡转变为直线型并修复。
先右后左双旋转(RL 型)
  • 场景:节点 A 的平衡因子为 -1(右子树高),在其右子树的左子树中插入新节点,使 A 的平衡因子变为 -2。
  • 操作步骤
    1. 对 A 的右子节点 D 的左子树进行右旋(以 E 为轴向右旋转);
    2. 再对 A 进行左旋,恢复平衡。
  • 目的:消除“折线型”失衡,转化为 RR 型后再处理。

2. 平衡二叉树的删除操作

  • 核心逻辑

    • 若被删节点有两个子树,则用其左子树中序遍历的最后一个节点(即左子树的最大值)或右子树中序遍历的第一个节点(即右子树的最小值)替代之,从而将问题转化为删除只有一个子树的节点。
    • 删除后,从被删节点位置沿路径向上回溯至根节点,逐层更新各节点的平衡因子
    • 若某节点的平衡因子变为 ±2,则判断其失衡类型(LL、RR、LR、RL),执行对应单旋或双旋操作重新平衡。
    • 旋转后可能缩短子树高度,需继续检查祖先节点是否仍平衡,直至整条路径处理完毕。
  • 时间复杂度:每次插入/删除最多引发 O(log n) 次旋转(实际通常仅需常数次),整体仍保持 O(log n)。


补充说明

AVL 树通过严格的平衡条件确保查找效率最优,但频繁的旋转增加了插入删除开销,适用于查询远多于修改的场景。后续如红黑树等结构在平衡性与维护成本之间做了折中。

# 示例:模拟 LR 型双旋转(简化示意)defrotate_LR(A):B=A.left C=B.right# 左旋 B 的右子树B.right=C.left C.left=B A.left=C# 右旋 Areturnrotate_right(A)defrotate_right(A):B=A.left A.left=B.right B.right=AreturnB

判断一个节点属于 LL、RR、LR 或 RL 失衡类型,关键在于分析失衡节点的平衡因子以及其子树中导致失衡的插入(或删除)位置。以下是具体判断方法:


1. 前提条件

  • 某节点 A 的平衡因子变为+2 或 -2,说明以 A 为根的子树失衡。
  • 需根据 A 的子树结构进一步判断是哪种类型。

2. 判断规则

(1)LL 型(Left-Left)
  • 表现:A 的平衡因子为+2,且其左子节点 B 的平衡因子为+1
  • 原因:新节点插入在 A 的左子树的左子树
  • 形态
A (+2) / B (+1) / C
  • 处理方式:对 A 执行右旋(单旋)

(2)RR 型(Right-Right)
  • 表现:A 的平衡因子为-2,且其右子节点 D 的平衡因子为-1
  • 原因:新节点插入在 A 的右子树的右子树
  • 形态
A (-2) \ D (-1) \ E
  • 处理方式:对 A 执行左旋(单旋)

(3)LR 型(Left-Right)
  • 表现:A 的平衡因子为+2,但其左子节点 B 的平衡因子为-1
  • 原因:新节点插入在 A 的左子树的右子树
  • 形态
A (+2) / B (-1) \ C
  • 处理方式:先对 B 做左旋,再对 A 做右旋(双旋转)

(4)RL 型(Right-Left)
  • 表现:A 的平衡因子为-2,但其右子节点 D 的平衡因子为+1
  • 原因:新节点插入在 A 的右子树的左子树
  • 形态
A (-2) \ D (+1) / C
  • 处理方式:先对 D 做右旋,再对 A 做左旋(双旋转)

总结口诀(便于记忆):

类型平衡因子(根)子节点平衡因子插入路径旋转方式
LL+2+1左 → 左右旋(单)
RR-2-1右 → 右左旋(单)
LR+2-1左 → 右先左后右(双)
RL-2+1右 → 左先右后左(双)

⚠️ 注意:删除操作也可能引发上述失衡,判断方式相同,但可能需要沿路径持续调整多个祖先节点。

# 判断失衡类型的伪代码示意defget_balance_type(node):bf=get_balance_factor(node)ifbf==2:left_bf=get_balance_factor(node.left)ifleft_bf==1:return"LL"elifleft_bf==-1:return"LR"elifbf==-2:right_bf=get_balance_factor(node.right)ifright_bf==-1:return"RR"elifright_bf==1:return"RL"return"Balanced"

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 12:15:04

迅雷离线下载后自动OCR?HunyuanOCR在下载工具中的创新应用

HunyuanOCR在下载工具中的创新应用 在今天的数字生活中,我们每天都在下载各种文件:从学术论文、电子书到网页截图、扫描文档。但你有没有遇到过这样的情况?好不容易用迅雷离线下载了一堆PDF讲义或图片资料,结果打开一看全是图像格…

作者头像 李华
网站建设 2026/6/15 13:07:28

如何将HunyuanOCR嵌入Web应用实现在线OCR工具网站

如何将HunyuanOCR嵌入Web应用实现在线OCR工具网站 在数字化浪潮席卷各行各业的今天,文档信息的快速提取与跨语言理解已成为办公、教育和跨境业务中的刚需。一张发票、一份合同、一段视频字幕——这些原本“沉睡”在图像中的文字,正通过光学字符识别&…

作者头像 李华
网站建设 2026/6/13 16:18:18

C++26来了!揭秘std::future新增超时控制的底层实现原理

第一章:C26 std::future 超时机制概述C26 对并发编程模型进行了重要增强,其中 std::future 的超时机制得到了标准化和统一。此前版本的 C(如 C11 至 C23)虽然支持通过 wait_for 和 wait_until 实现有限等待,但行为在异…

作者头像 李华
网站建设 2026/6/1 12:27:18

Clang 17性能优化十大陷阱:90%工程师都踩过的坑,你中了几个?

第一章:Clang 17性能优化的核心价值与挑战Clang 17作为LLVM项目的重要组成部分,不仅延续了对C、C和Objective-C语言的高效支持,更在编译时性能、代码生成质量以及诊断信息精确性方面实现了显著提升。其核心价值体现在更智能的优化策略、更低的…

作者头像 李华
网站建设 2026/6/15 14:59:43

百度网盘智能分类:结合HunyuanOCR识别图片内容打标签

百度网盘智能分类:结合HunyuanOCR识别图片内容打标签 在百度网盘每天处理数亿张用户上传的图片时,一个看似简单却长期困扰工程师的问题浮现出来:如何让一张名为“IMG_20240512_193845.jpg”的合同截图,能被搜索“租房合同”准确命…

作者头像 李华
网站建设 2026/6/15 13:09:43

IP 地址实用工具表

这是一张IP 地址实用工具表,整合了网络配置中常用的信息,核心功能是辅助 IP 地址规划、子网划分及网络参数配置,主要包含以下模块及解读: 1. 子网划分工具 列出了不同子网位数对应的子网掩码、可用 IP 地址数量、通配符,可快速计算子网的地址范围与资源量(例如 / 24 子…

作者头像 李华