题目描述
解题思路
根据二叉树前序遍历和中序遍历的特征, 我们通过递归思路解决这个问题
以下边数据为例:
前序遍历: [A, B, D, E, C, F, G]
中序遍历: [D, B, E, A, F, C, G]
- 拿到前序遍历数组的第一个元素 A, 那么 A 肯定是当前二叉树的根节点
- 在中序遍历数组中找到元素 A 的下标 3
- 中序遍历数组中, [0, 3)的元素就是 根节点A 左子树上的所有节点 [D, B, E], 并且还是这些节点的中序遍历, 假设元素个数为 N1,
- 中序遍历数组中, (3,END]的元素就是 根节点A 右子树上的所有节点 [ F, C, G], 同样是这些节点的中序遍历, 假设元素个数为N2,
- 前序遍历数组中拿到[1, N1]的子数组 [B, D, E], 这个子数组就是 步骤3中序遍历数组对应前序遍历数组
- 前序遍历数组中拿到(N1, END]的子数组 [C, F, G], 那么这个子数组就是步骤4中序遍历数组对应前序遍历遍历数组
- 这样我们就拿到 根节点1 左右子树对应的前序和中序遍历数组, 然后都左右子树分别递归, 就可以得到最终的二叉树
示例代码
def buildTree(preorder: [int], inorder: [int]):
if len(preorder) > 1:
hVal = preorder[0]
hIdx = inorder.index(hVal)
left_p = preorder[1 : hIdx + 1]
right_p = preorder[hIdx + 1 :]
left_i = inorder[:hIdx]
right_i = inorder[hIdx + 1 :]
head = helper.TreeNode(hVal)
head.left = buildTree(left_p, left_i)
head.right = buildTree(right_p, right_i)
return head
elif len(preorder) == 0:
return None
else:
head = helper.TreeNode(preorder[0])
return head