返回
从中序和后序遍历序列构造二叉树·8 月更文挑战
后端
2024-01-14 15:02:57
从中序和后序遍历序列构造二叉树
给定一个长度为 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
算法思想
本题可以利用以下事实来解决:
- 中序遍历序列可以唯一确定一棵二叉树的结构。
- 后序遍历序列可以唯一确定一棵二叉树的每个节点的值。
因此,我们可以先利用中序遍历序列构造一棵二叉树的结构,然后再利用后序遍历序列为这棵二叉树的每个节点赋值。
算法步骤
- 利用中序遍历序列构造一棵二叉树的结构。
- 利用后序遍历序列为这棵二叉树的每个节点赋值。
- 返回构造好的二叉树。
算法复杂度
- 时间复杂度: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)
参考文献