Appearance
题目
若将关键字 1,2,3,4,5,6,7 依次插入到初始为空的平衡二叉树 T 中,则 T 中平衡因子为 0 的分支结点的个数是( )。
错因
A
误以为依次插入升序数据,AVL 树会一边倒、不可能存在平衡因子为 0 的节点。但 AVL 的旋转机制就是为了修复这种偏斜——本题恰好 7 个节点能填出一棵满二叉树,每个分支节点左右子树完全等高,BF=0 的分支节点不只存在,而且全是。
B
只看了根节点(最终根是 4,BF=0),忘了树里还有 2 和 6 这两个内部分支节点,它们各自的左右子树也都是单节点(高度 1 == 高度 1),同样 BF=0。
C
数到了 4 和某一个内部节点(比如 2 或 6),漏掉了另一个。升序插入 7 个连续整数经过若干次左旋后会变成完全平衡的满二叉树,三个分支节点(4、2、6)BF 全是 0,没有一个非零。
总解析
逐步插入 + 失衡修复过程(BF = 左子树高 − 右子树高):
| 步骤 | 操作 | 树结构(紧凑括号) | 旋转 |
|---|---|---|---|
| 1 | 插 1 | 1 | — |
| 2 | 插 2 | 1(_, 2) | — |
| 3 | 插 3 → 1 失衡(BF=−2,RR 型) | 2(1, 3) | 对 1 左旋 |
| 4 | 插 4 | 2(1, 3(_, 4)) | — |
| 5 | 插 5 → 3 失衡(BF=−2,RR 型) | 2(1, 4(3, 5)) | 对 3 左旋 |
| 6 | 插 6 → 2 失衡(BF=−2,RR 型) | 4(2(1, 3), 5(_, 6)) | 对 2 左旋 |
| 7 | 插 7 → 5 失衡(BF=−2,RR 型) | 4(2(1, 3), 6(5, 7)) | 对 5 左旋 |
最终的树:
统计 BF=0 的分支结点(叶子 1、3、5、7 不算分支结点):
| 节点 | 左子树高 | 右子树高 | BF | 是否分支 |
|---|---|---|---|---|
| 4 | 2 | 2 | 0 | ✓ |
| 2 | 1 | 1 | 0 | ✓ |
| 6 | 1 | 1 | 0 | ✓ |
三个分支节点 BF 全为 0。
背景观察:连续整数升序插入 AVL 树,每当节点数达到 (即 1、3、7、15、…)时,树形恰好是高度 的满二叉树——所有非叶节点都 BF=0。本题 正好踩在这个特殊点上,所以答案才是"3 个全部"而不是"少于 3"。
最终答案是 D(3)。