Appearance
题目
已知一棵二叉树的树形如下图所示,若其后序遍历为 f, d, b, e, c, a,则其先序序列为( )。
结构(文字版)(节点按层序由 1 到 6 编号;编号仅为表述方便,原题节点皆为空圆):根 1 的左孩子是 2、右孩子是 3(叶子);2 的左孩子是 4、右孩子是 5(叶子);4 没有左孩子,右孩子是 6(叶子)。
错因
B
把先序写成了"根 → 右 → 左"。题目里 a 是根(√),但接着先访问了右子树 c,再回到左子树。这是把先序和后序、或者把"先右"和"先左"搞反了——先序的标准是"根 → 左 → 右",不能调换顺序。
C
把先序当成"中序"或"后序"了。中序是"左 → 根 → 右",先访问最左的叶子。本题最左叶子是 f(树形里 6 号节点对应 f),但先序的第一个一定是根,绝不可能是 f 或更深的节点。看到 c 在第一位且不是根,明显违反先序定义。
D
把先序写成了后序。题目已经给出后序是 f, d, b, e, c, a;选项 D 的字母组合"dfebac"看上去也像是某种自下而上的顺序,但和给定后序顺序不一致,实际上是把"左 → 右 → 根"和具体节点顺序又错搞了一次——常见于硬背遍历公式但没具体把节点对应清楚的情形。
总解析
第一步:用编号 + 后序对照,给空节点贴标签
按层序给节点编号(如题干 fence 所示):1 = 根、2 = 1 的左孩子、3 = 1 的右孩子、4 = 2 的左孩子、5 = 2 的右孩子、6 = 4 的右孩子。对这棵树做后序遍历得到:6, 4, 5, 2, 3, 1。
把它和题目给的后序 f, d, b, e, c, a 一一对应:
| 后序位置 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 编号 | 6 | 4 | 5 | 2 | 3 | 1 |
| 字母 | f | d | b | e | c | a |
由此得到节点字母:1=a(根)、2=e、3=c、4=d、5=b、6=f。
第二步:在贴好标签的树上做先序遍历
先序"根 → 左 → 右":
- 根 a
- 进入左子树(根 e):访问 e → 进入 e 的左子树(根 d):访问 d → 进入 d 的右子树(根 f,叶子):访问 f → 回到 e 的右孩子(叶子 b):访问 b
- 回到根的右孩子(叶子 c):访问 c
最终答案是 A(a, e, d, f, b, c)。