📅  最后修改于: 2023-12-03 15:07:34.148000             🧑  作者: Mango
这是一道ISRO CS 2014考试的问题,涉及到二叉树的遍历。
给定一个二叉树的前序和中序遍历结果,输出二叉树的后序遍历结果。
前序遍历数组:{4, 2, 1, 3, 6, 5, 7}
中序遍历数组:{1, 2, 3, 4, 5, 6, 7}
后序遍历数组:{1, 3, 2, 5, 7, 6, 4}
要求输出二叉树的后序遍历结果,需要先知道什么是二叉树的后序遍历。后序遍历的定义是:先遍历左子树,再遍历右子树,最后遍历根节点。因此我们可以通过前序遍历和中序遍历结果构建二叉树,然后按照后序遍历的定义遍历它。
具体来说,我们可以通过前序遍历结果确定根节点,然后在中序遍历结果中找到该根节点的位置,其左边部分即为左子树的中序遍历结果,右边部分即为右子树的中序遍历结果。根据左子树的中序遍历结果和前序遍历结果构建左子树,根据右子树的中序遍历结果和前序遍历结果构建右子树,最后再将根节点加入到答案中,就能得到二叉树的后序遍历结果了。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if not preorder or not inorder:
return None
root_val = preorder[0]
root = TreeNode(root_val)
idx = inorder.index(root_val)
root.left = self.buildTree(preorder[1:idx + 1], inorder[:idx])
root.right = self.buildTree(preorder[idx + 1:], inorder[idx + 1:])
return root
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
return self.postorderTraversal(root.left) + self.postorderTraversal(root.right) + [root.val]
代码中的buildTree
函数用于根据前序遍历和中序遍历结果构建二叉树,postorderTraversal
函数用于遍历这棵树并返回后序遍历结果。注意到我们使用了Python中列表切片(Slicing)的语法来获取前序遍历结果的左右子树、中序遍历结果的左右子树。