【LeetCode】105. 从前序与中序遍历序列构造二叉树
解题思路
根据二叉树的前序遍历和中序遍历序列构建二叉树的核心在于利用两种遍历的特性定位根节点和子树边界:
- 前序遍历:首个元素是根节点,随后是左子树节点,最后是右子树节点
- 中序遍历:根节点左侧是左子树节点,右侧是右子树节点
- 分治策略:通过根节点在中序序列的位置确定左右子树边界,递归构建子树
关键步骤
- 终止条件:当遍历序列为空时返回
nil - 根节点定位:前序序列首元素即为根节点值
- 划分子树:
- 在中序序列中找到根节点位置
rootIndex - 计算左子树节点数
leftNum = rootIndex - inStart
- 在中序序列中找到根节点位置
- 递归构建:
- 左子树:前序范围
[preStart+1, preStart+leftNum],中序范围[inStart, rootIndex-1] - 右子树:前序范围
[preStart+leftNum+1, preEnd],中序范围[rootIndex+1, inEnd]
- 左子树:前序范围
代码实现
代码解析
-
索引映射:
- 构建
inorder值到索引的哈希映射,将根节点查找从 O(n) 优化到 O(1)
- 构建
-
递归函数:
- 终止条件:当子树序列为空时返回
nil - 根节点创建:前序首元素构建根节点
- 子树边界计算:
leftNum = rootIndex - inStart确定左子树节点数- 左子树前序范围:
[preStart+1, preStart+leftNum] - 右子树前序范围:
[preStart+leftNum+1, preEnd]
- 终止条件:当子树序列为空时返回
示例测试
复杂度分析
| 指标 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 每个节点只处理1次 |
| 空间复杂度 | O(n) | 哈希表存储n个索引,递归栈深度O(h)(h为树高) |
关键点
- 分治策略:将问题分解为左/右子树构建子问题
- 索引优化:哈希表加速中序根节点定位(从O(n)→O(1))
- 边界处理:
- 左子树节点数
leftNum = rootIndex - inStart - 右子树前序起始
preStart + leftNum + 1
- 左子树节点数
- 完全二叉树特性:中序根节点左侧必为左子树

浙公网安备 33010602011771号