这个题解使用递归的方法来构建二叉树。主要思路是根据前序遍历和后序遍历的特点,找到根节点和左右子树的范围,递归地构建左右子树。具体来说:
1. 前序遍历的第一个元素是根节点
2. 在后序遍历中找到前序遍历第二个元素的位置,可以得到左子树的大小
3. 根据左子树大小,可以确定前序遍历和后序遍历中左右子树的范围
4. 递归地构建左子树和右子树
5. 返回根节点
时间复杂度: O(n)
空间复杂度: O(n)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
def myTree(preorder_left:int, preorder_right: int, postorder_left: int, postorder_right: int):
# 终止条件:前序遍历的左指针大于右指针
if preorder_left > preorder_right:
return None
# 获取前序遍历的根节点下标
preorder_root = preorder_left
# 创建根结点
root = TreeNode(preorder[preorder_root])
# 如果前序遍历的左指针加1大于右指针,说明已经没有子节点了,直接返回当前根节点
if preorder_left + 1 > preorder_right:
return root
# 计算左子树的大小:
# 在后序遍历中找到前序遍历第二个元素的下标,它与后序遍历左指针的差加1就是左子树大小
size_left_subtree = postorder_index[preorder[preorder_left + 1]] - postorder_left + 1
# 递归构建左子树
root.left = myTree(preorder_left + 1, preorder_left + size_left_subtree, postorder_left, postorder_left + size_left_subtree - 1)
# 递归构建右子树
root.right = myTree(preorder_left + size_left_subtree + 1, preorder_right, postorder_left + size_left_subtree, postorder_right - 1)
return root
# 获取二叉树节点数
n = len(postorder)
# 用哈希表存储后序遍历中每个元素的下标,便于查找
postorder_index = {element: i for i, element in enumerate(postorder)}
# 调用递归函数,传入前序遍历和后序遍历的左右指针
return myTree(0, n - 1, 0, n - 1)