要解决这个问题,核心是利用层序遍历(从上到下、从左到右)的第一个元素是根节点,结合中序遍历(左-根-右)划分左右子树,逐步重建二叉树,最终得到后序遍历(左-右-根)。
步骤1:确定根节点(层序遍历的第一个元素)
层序遍历的本质是“逐层从左到右遍历”,因此层序序列的第一个元素是整个树的根节点。
题目中层序序列为a, b, g, c, d, e, f,第一个元素是a,故根节点为a。
步骤2:通过中序序列划分左/右子树
中序遍历的本质是“左子树 → 根 → 右子树”,因此在中序序列中找到根节点a,其左侧为左子树,右侧为右子树:
- 中序序列:b, e, d, f, c, a, g
- 左子树中序:[b, e, d, f, c](根a左侧)
- 右子树中序:[g](根a右侧)
步骤3:通过层序序列确定子树根节点
层序序列中,根节点a之后的元素按“左子树 → 右子树”的顺序排列:
- 层序序列(排除根a):b, g, c, d, e, f
- 右子树仅含g(中序已确定),因此g是a的右孩子;
- 剩余元素b, c, d, e, f属于左子树,其中层序第一个元素b是左子树的根(a的左孩子)。
步骤4:递归重建左子树(根为b,中序[b, e, d, f, c])
1. 中序中b是第一个元素 → b的左子树为空,右子树为[e, d, f, c];
2. 层序中b之后的左子树元素是c → c是b的右孩子(右子树的根);
3. 中序中c的左侧是[e, d, f](c的左子树),右侧为空;
4. 层序中c之后的左子树元素是d → d是c的左孩子;
5. 中序中d的左侧是[e](d的左子树),右侧是[f](d的右子树);
6. 层序中d之后的元素是e、f → e是d的左孩子,f是d的右孩子。
步骤5:最终二叉树结构(与中序、层序完全匹配)
a
/ \
b g
\
c
/
d
/ \
e f
步骤6:生成后序遍历(左-右-根)
按“左子树 → 右子树 → 根”的顺序遍历:
1. d的子树:e(左)→ f(右)→ d(根);
2. c的子树:e,f,d(左)→ 空(右)→ c(根);
3. b的子树:空(左)→ e,f,d,c(右)→ b(根);
4. a的子树:e,f,d,c,b(左)→ g(右)→ a(根)。
最终后序遍历序列为:e, f, d, c, b, g, a,对应选项C。