剑指 Offer 07. 重建二叉树

103 阅读1分钟

题目描述

重建二叉树

解题思路

根据二叉树前序遍历和中序遍历的特征, 我们通过递归思路解决这个问题

以下边数据为例:
前序遍历: [A, B, D, E, C, F, G]
中序遍历: [D, B, E, A, F, C, G]

  1. 拿到前序遍历数组的第一个元素 A, 那么 A 肯定是当前二叉树的根节点
  2. 在中序遍历数组中找到元素 A 的下标 3
  3. 中序遍历数组中, [0, 3)的元素就是 根节点A 左子树上的所有节点 [D, B, E], 并且还是这些节点的中序遍历, 假设元素个数为 N1,
  4. 中序遍历数组中, (3,END]的元素就是 根节点A 右子树上的所有节点 [ F, C, G], 同样是这些节点的中序遍历, 假设元素个数为N2,
  5. 前序遍历数组中拿到[1, N1]的子数组 [B, D, E], 这个子数组就是 步骤3中序遍历数组对应前序遍历数组
  6. 前序遍历数组中拿到(N1, END]的子数组 [C, F, G], 那么这个子数组就是步骤4中序遍历数组对应前序遍历遍历数组
  7. 这样我们就拿到 根节点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