这是一道二叉树的经典问题,不仅考察对二叉树遍历的理解,更考验递归思维和边界处理能力。
核心思路
采用分治思想:
通过前序遍历确定根节点,在中序遍历中定位该根节点的位置,以此为分界点划分出左右子树的范围,然后递归地对左右子树重复这个过程,最终完成整棵树的重建。
索引计算的推导
假设:
|
|
1.中序遍历的划分
根节点 k 天然就是分界点:
|
|
- 左子树范围:
in[l2, k-1] - 右子树范围:
in[k+1, r2]
2.前序遍历的划分
|
|
已知左子树有 k - l2 个节点,所以:
|
|
- 左子树范围:
pre[l1+1, l1+k-l2] - 右子树范围:
pre[l1+k-l2+1, r1]
拿示例1举例
假设输入:
|
|
第1步: 前序首元素 3 是根节点,在中序中位置为 1
|
|
第2步: 递归处理左子树 [9] 和右子树 [20, 15, 7]
第3步: 右子树中,20 是根节点,继续划分…
最终构建出:
|
|
代码实现
|
|
如果觉得有帮助,欢迎点赞、关注、转发~