1. 题目背景与核心需求
这道PTA天梯赛L2-006题目考察的是二叉树的基本操作和遍历算法。题目给出了一个二叉树的后序遍历序列和中序遍历序列,要求我们还原出原始二叉树,然后输出该二叉树的层序遍历结果。
在实际编程竞赛和面试中,这类题目非常常见,因为它综合考察了以下几个核心能力:
- 对二叉树结构的理解
- 对三种基本遍历方式(前序、中序、后序)的掌握
- 递归算法的应用
- 层序遍历(广度优先搜索)的实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二叉树遍历基础回顾
2.1 三种基本遍历方式
在解决这个问题之前,我们需要明确二叉树的三种基本遍历方式:
- 前序遍历(Preorder):根节点 → 左子树 → 右子树
- 中序遍历(Inorder):左子树 → 根节点 → 右子树
- 后序遍历(Postorder):左子树 → 右子树 → 根节点
2.2 层序遍历
层序遍历(Level Order Traversal)是从上到下、从左到右逐层访问树中节点的遍历方式。它需要使用队列(Queue)这种数据结构来实现广度优先搜索(BFS)。
3. 从遍历序列重建二叉树
3.1 后序和中序序列的特性
给定后序和中序遍历序列,我们可以利用以下特性重建二叉树:
- 后序遍历的最后一个元素一定是整棵树的根节点
- 在中序遍历序列中,根节点将序列分为左子树和右子树两部分
3.2 重建算法步骤
- 确定根节点:后序遍历的最后一个元素就是当前子树的根节点
- 在中序序列中定位根节点:找到根节点在中序序列中的位置,这将序列分为左子树和右子树
- 计算子树大小:根据中序序列的分割,可以确定左子树和右子树的节点数量
- 递归构建子树:对左子树和右子树分别重复上述过程
3.3 实现细节
cpp复制BinTree solve(int zl, int zr, int hl, int hr) {
if(zl > zr) return nullptr;
BinTree nbt = new Node;
nbt->data = h[hr]; // 后序最后一个元素是根
int pos = find(nbt->data); // 在中序中找到根的位
