408真题解析-2010-4-数据结构-平衡二叉树插入

一 真题2010-4

2010-04. 在右图所示的平衡二叉树中,插入关键字 48 后得到一棵新平衡二叉树。

在新平衡二叉树中,关键字 37 所在结点的左、右子结点中保存的关键字分别是( )

A. 13, 48

B. 24, 48

C. 24, 53

D. 24, 90

复制代码
        24
       /  \
     13    53
         /    \  
        37    90

二 题目要素解析

核心概念平衡二叉树(AVL 树)

  • 平衡因子(BF):节点的左子树高度 - 右子树高度,AVL 树要求所有节点的 BF ∈ {-1, 0, 1}。
  • 插入失衡修复:插入节点后若 BF 超出范围,需通过旋转(左旋 / 右旋) 恢复平衡,常见旋转类型包括 LL、RR、LR、RL。

操作流程:插入 48 → 检查平衡因子 → 定位失衡节点 → 旋转修复 → 确定 37 的子节点。

关键节点:插入 48 后,需跟踪 53、37 等节点的子树结构变化。

三 哔哔详解

步骤 1:按 BST 规则插入 48

原树结构:

复制代码
        24
       /  \
     13    53
         /    \  
        37    90
  • 48 > 24 → 走右子树 53。
  • 48 < 53 → 走左子树 37。
  • 48 > 37 → 成为 37 的右孩子。

插入后临时结构:

复制代码
        24
       /  \
     13    53
         /    \  
        37    90
         \
          48

步骤 2:计算平衡因子,定位失衡节点

从插入点 48 向上回溯:

  • 节点 37:左高 0,右高 1 → BF = -1
  • 节点 53:左高 2,右高 1 → BF = 1
  • 节点 24:左高 1,右高 3 → BF = -2(失衡!)

失衡类型为 RL 型(失衡节点 24 的右孩子 53 的左子树插入导致失衡)。


步骤 3:执行旋转修复

  1. 右旋 53

    (先处理右孩子的左子树):

    • 37 成为 53 的父节点。
    • 53 成为 37 的右孩子。
    • 37 原来的右孩子 48 保持不变。
    plaintext 复制代码
            24
           /  \
         13    37
              /  \
             空   53
                 /  \
                48   90

2.左旋 24(修复根节点失衡):

  • 37 成为新的根节点。
  • 24 成为 37 的左孩子。
  • 53 保持为 37 的右孩子。

最终修复后的平衡二叉树:

复制代码
            37
           /  \
         24    53
        /     /  \
      13    48   90

步骤 4:确定 37 的子节点

从最终结构可见:

  • 37 的左子节点:24
  • 37 的右子节点:53

这正好对应选项 C

四 参考答案

C

五 考点精析

5.1 平衡二叉树概念和性质特征

5.1.1 基本概念

平衡二叉树(AVL Tree)

它是一棵二叉排序树(BST),且在 BST 的基础上增加了 "平衡" 的限制条件:

  • 空树是平衡二叉树。
  • 若非空树,则其左、右子树都是平衡二叉树 ,且左子树和右子树的高度差的绝对值不超过 1

平衡因子(Balance Factor, BF)

  • 定义:BF(T)=hL−hR (左子树高度 - 右子树高度)。
  • AVL 树要求:对于树中每一个节点,都有 BF∈{−1,0,1}。

5.1.2 性质特征

结构自平衡

在插入或删除节点时,如果破坏了平衡条件(即出现了 BF=2 或 BF=−2 的节点),树会通过旋转操作自动恢复平衡。

高度与节点数的关系

平衡二叉树的高度 h 与节点数 n 之间的关系是 h = O(\\log_2 n)

  • 这保证了 AVL 树的查找、插入、删除操作的时间复杂度均为 O(log⁡n)O(\log n)O(logn)。

最小节点数

N_h 为高度为 h 的 AVL 树的最少节点数,则递推公式为:
Nh=Nh−1+Nh−2+1 N_h = N_{h-1} + N_{h-2} + 1 Nh=Nh−1+Nh−2+1

初始条件:
N0=0,N1=1 N_0 = 0,\quad N_1 = 1 N0=0,N1=1

  • 记忆:类似斐波那契数列。

    高度 hhh 最少节点数 NhN_hNh
    0 0
    1 1
    2 N1+N0+1=1+0+1=2N_1 + N_0 + 1 = 1 + 0 + 1 = 2N1+N0+1=1+0+1=2
    3 N2+N1+1=2+1+1=4N_2 + N_1 + 1 = 2 + 1 + 1 = 4N2+N1+1=2+1+1=4
    4 N3+N2+1=4+2+1=7N_3 + N_2 + 1 = 4 + 2 + 1 = 7N3+N2+1=4+2+1=7

5.2 四种旋转(LL/RR/LR/RL)步骤速记

这是考试中画图和做选择题的关键。判断旋转类型的核心在于 "看失衡节点的哪一侧子树更高,以及导致失衡的新节点在那一侧的哪一边"

1. 核心判断口诀

"看失衡,找孩子;左左 LL,右右 RR;左右 LR,右左 RL。"

  • LL 型 :失衡节点的左孩子 高,且新节点插入在左孩子的左子树
  • RR 型 :失衡节点的右孩子 高,且新节点插入在右孩子的右子树
  • LR 型 :失衡节点的左孩子 高,且新节点插入在左孩子的右子树
  • RL 型 :失衡节点的右孩子 高,且新节点插入在右孩子的左子树

2🌳 旋转操作总览及示例(以节点 A 为失衡点)

类型 判断条件(插入路径) 旋转方式 新根 口诀
LL A → 左(B) → 左© A 右旋 B 左左 → 右旋
RR A → 右(B) → 右© A 左旋 B 右右 → 左旋
LR A → 左(B) → 右© B 左旋 + A 右旋 C 左右 → 先左后右
RL A → 右(B) → 左© B 右旋 + A 左旋 C 右左 → 先右后左

关键

  • A:第一个 BF 超限的祖先(失衡点)
  • B:A 的孩子(左或右)
  • C:B 的孩子(插入发生的位置)

1. LL 型(Left-Left)------ 右旋(Right Rotation)

🔍 判断
  • 插入发生在 A 的左孩子的左子树
🔄 操作
  • A 执行右旋
  • B 成为新根
📐 图例
复制代码
      A                     B
     /                     / \
    B          →          C   A
   /
  C
🧠 说明
  • B 的右子树(若有)成为 A 的左子树
  • 保持 BST 性质:C < B < A

2. RR 型(Right-Right)------ 左旋(Left Rotation)

🔍 判断
  • 插入发生在 A 的右孩子的右子树
🔄 操作
  • A 执行左旋
  • B 成为新根
📐 图例
复制代码
A                         B
 \                       / \
  B          →          A   C
   \
    C
🧠 说明
  • B 的左子树(若有)成为 A 的右子树
  • 保持 BST 性质:A < B < C

3. LR 型(Left-Right)------ 先左旋,后右旋

🔍 判断
  • 插入发生在 A 的左孩子的右子树
🔄 操作
  1. B(A 的左孩子)执行左旋
  2. A 执行右旋
  • C 成为新根
📐 图例

初始(LR 型)

复制代码
    A
   /
  B
   \
    C

Step 1:B 左旋 → 转为 LL 型

复制代码
    A
   /
  C
 /
B

Step 2:A 右旋 → 平衡

复制代码
    C
   / \
  B   A
🧠 说明
  • C 的左子树 → B 的右子树
  • C 的右子树 → A 的左子树
  • 最终:B < C < A

4. RL 型(Right-Left)------ 先右旋,后左旋

🔍 判断
  • 插入发生在 A 的右孩子的左子树
🔄 操作
  1. B(A 的右孩子)执行右旋
  2. A 执行左旋
  • C 成为新根
📐 图例

初始(RL 型)

复制代码
A
 \
  B
 /
C

Step 1:B 右旋 → 转为 RR 型

复制代码
A
 \
  C
   \
    B

Step 2:A 左旋 → 平衡

复制代码
    C
   / \
  A   B
🧠 说明
  • C 的左子树 → A 的右子树
  • C 的右子树 → B 的左子树
  • 最终:A < C < B

✅ 快速判断流程图(文字版)

复制代码
插入新节点后,从插入点向上找第一个 |BF| > 1 的节点 A
│
├─ 若插入在 A 的左子树:
│   ├─ 若插入在 A.left 的左子树 → LL 型 → 右旋
│   └─ 若插入在 A.left 的右子树 → LR 型 → 先左旋(A.left),再右旋(A)
│
└─ 若插入在 A 的右子树:
    ├─ 若插入在 A.right 的右子树 → RR 型 → 左旋
    └─ 若插入在 A.right 的左子树 → RL 型 → 先右旋(A.right),再左旋(A)

六 考点跟踪

年份 题号 考查内容 CSDN 参考链接 VX参考链接
2010 第4题 平衡二叉树插入
2019 第4题 平衡二叉树删除
2020 第5题 平衡二叉树生成

说明 :本文内容基于公开资料整理,参考了包括但不限于《数据结构》(严蔚敏)、《计算机操作系统》(汤小丹)、《计算机网络》(谢希仁)、《计算机组成原理》(唐朔飞)等国内高校经典教材,以及其他国际权威著作。同时,借鉴了王道、天勤、启航等机构出版的计算机专业考研辅导系列丛书 中的知识体系框架与典型题型分析思路。文中所有观点、例题解析及文字表述均为作者结合自身理解进行的归纳与重述,未直接复制任何出版物原文。内容仅用于学习交流,若有引用不当或疏漏之处,敬请指正。

相关推荐
历程里程碑2 小时前
哈希3 : 最长连续序列
java·数据结构·c++·python·算法·leetcode·tornado
2401_841495642 小时前
【LeetCode刷题】两两交换链表中的节点
数据结构·python·算法·leetcode·链表·指针·迭代法
无尽的罚坐人生2 小时前
hot 100 560.和为 K 的子数组
数据结构·算法·leetcode
Ll13045252982 小时前
leetcode代码随想录数组篇
数据结构·算法·leetcode
Remember_9933 小时前
【LeetCode精选算法】位运算专题一
java·开发语言·数据结构·leetcode·哈希算法
tobias.b3 小时前
408真题解析-2010-5-数据结构-树的结点数量计算
数据结构·算法·408真题解析
仰泳的熊猫4 小时前
题目 1429: 蓝桥杯2014年第五届真题-兰顿蚂蚁
数据结构·c++·算法·蓝桥杯
Yupureki4 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-分治
c语言·开发语言·数据结构·c++·算法·贪心算法
充值修改昵称4 小时前
数据结构基础:B*树B+树的极致优化
数据结构·b树·python·算法