Skip to content

2021年 408 数据结构 第 6 题

数据结构2021年选择题2分

题目

给定平衡二叉树如下图所示,插入关键字 23 后,根中的关键字是( )。

2016302540

错因

A

把旋转方向搞反。误以为 20 失衡时左重,做"右单旋"把 16 抬上来。其实 20 是右子树过深(BF = -2),属于右重;正确方向是 RL 双旋,旋转后到根的是 25 而不是 16。把"哪边重 → 哪边旋"搞反是 AVL 旋转最经典的失误。

B

没意识到失衡需要旋转。插入 23 后只检查了"23 是否合法插入"——比较 23 < 30、23 < 25 走到 25 的左空位插入——但没回头检查祖先结点的平衡因子。结果 BF(20) = -2 失衡被忽略,于是认为根仍是 20。AVL 插入后沿插入路径向上回溯检查 BF 这一步常被遗漏。

C

误以为新插入的 23 会被旋转拎到根。RL 双旋上升到根的是失衡点的"右子树的左孙子"——此题是 25(20 的右孩子 30 的左孩子);不是新插入的 23(更深一层的曾孙)。混淆"中间结点"和"新结点"是 RL/LR 双旋的高频误区。

总解析

第一步:插入 23,定位插入路径

按 BST 规则比较:23 < 30 → 走 30 的左;23 < 25 → 走 25 的左;25 的左空 → 在那里挂上 23。插入后的初始树:

201630252340

第二步:沿插入路径向上检查平衡因子(BF = 左子树高 − 右子树高)

结点左子树高右子树高BF状态
23000
251(含 23)0+1
302(25→23)1(40)+1
201(16)3(30→25→23)−2✗ 失衡

第三步:判断旋转类型

失衡点 20 的 BF = −2(右重);其右孩子 30 的 BF = +1(左重)。"父右子左 → RL 双旋"。

第四步:执行 RL 双旋

RL 双旋的本质:先把 30 与 25 这一对"右-左"绕成一条直线(先右旋 30),再统一左旋 20。

1. 对 30 做右旋(25 上升取代 30 的位置,30 变成 25 的右孩子,25 原右孩子接到 30 的左空位):

旋转 30 子树前:

30252340

旋转 30 子树后:

25233040

整棵树临时形态:

201625233040

2. 对 20 做左旋(25 上升取代 20 的位置,20 变成 25 的左孩子,25 原左孩子 23 接到 20 的右空位):

旋转后:

252016233040

第五步:读出根

新根是 25。整棵 AVL 树的最终形态:

252016233040

最终答案是 D(25)

AVL 旋转口诀(速查):失衡点 BF 与孩子 BF 同号 → 单旋(LL 或 RR);异号 → 双旋(LR 或 RL)。双旋后上升到根的是孙子(中间结点),不是新插入的曾孙

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数