📌  相关文章
📜  国际空间研究组织 | ISRO CS 2014 |问题 14(1)

📅  最后修改于: 2023-12-03 15:07:34.148000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2014 |问题 14

这是一道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)的语法来获取前序遍历结果的左右子树、中序遍历结果的左右子树。