返回

从中序和后序遍历序列构造二叉树·8 月更文挑战

后端

从中序和后序遍历序列构造二叉树

给定一个长度为 n 的整数数组 nums 。 假设 arrk 是数组 nums 顺时针旋转 k 次后的结果,其中 0 <= k < n 。

请返回 arr0 。

示例 1:

输入:nums = [1,2,3,4,5,6,7], k = 3
输出:[5,6,7,1,2,3,4]
解释:
arr0 是 [1,2,3,4,5,6,7] 。
顺时针旋转 1 次,arr1 = [7,1,2,3,4,5,6] 。
顺时针旋转 2 次,arr2 = [6,7,1,2,3,4,5] 。
顺时针旋转 3 次,arr3 = [5,6,7,1,2,3,4] 。
因此,arr0 = [5,6,7,1,2,3,4]

示例 2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,-1,-100,99]
解释:
arr0 是 [-1,-100,3,99] 。
顺时针旋转 1 次,arr1 = [99,-1,-100,3] 。
顺时针旋转 2 次,arr2 = [3,-1,-100,99] 。
因此,arr0 = [3,-1,-100,99] 。

提示:

  • 1 <= nums.length <= 200
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k < nums.length

算法思想

本题可以利用以下事实来解决:

  • 中序遍历序列可以唯一确定一棵二叉树的结构。
  • 后序遍历序列可以唯一确定一棵二叉树的每个节点的值。

因此,我们可以先利用中序遍历序列构造一棵二叉树的结构,然后再利用后序遍历序列为这棵二叉树的每个节点赋值。

算法步骤

  1. 利用中序遍历序列构造一棵二叉树的结构。
  2. 利用后序遍历序列为这棵二叉树的每个节点赋值。
  3. 返回构造好的二叉树。

算法复杂度

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

代码实现

def buildTree(inorder, postorder):
    """
    :type inorder: List[int]
    :type postorder: List[int]
    :rtype: TreeNode
    """
    # 构建哈希表,便于快速查找中序遍历序列中每个元素的索引
    inorder_map = {}
    for i, val in enumerate(inorder):
        inorder_map[val] = i

    def build(start, end):
        # 如果起始索引大于结束索引,则返回空节点
        if start > end:
            return None

        # 获取根节点的值
        root_val = postorder.pop()

        # 在中序遍历序列中查找根节点的索引
        root_index = inorder_map[root_val]

        # 构建左子树
        left = build(start, root_index - 1)

        # 构建右子树
        right = build(root_index + 1, end)

        # 返回根节点
        return TreeNode(root_val, left, right)

    # 构建整棵二叉树
    return build(0, len(inorder) - 1)

参考文献