📜  从给定的 Inorder 和 Preorder 遍历打印 Postorder 遍历(1)

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

从给定的 Inorder 和 Preorder 遍历打印 Postorder 遍历

介绍

在树的遍历中,人们通常使用三种遍历方式,即前序遍历、中序遍历和后序遍历。前序遍历意味着每当我们遇到一个节点时,首先访问这个节点并打印数据,然后递归地遍历它的左子树,最后递归地遍历它的右子树。中序遍历意味着每当我们遇到一个节点时,首先递归地遍历它的左子树,然后访问这个节点并打印数据,最后递归地遍历它的右子树。后序遍历意味着每当我们遇到一个节点时,首先递归地遍历它的左子树,然后递归地遍历它的右子树,最后访问该节点并打印数据。

这篇文章介绍了如何从给定的 Inorder 和 Preorder 遍历打印 Postorder 遍历。

算法

我们可以通过以下步骤来打印 Postorder 遍历:

  1. 根据 Preorder 遍历选取当前节点作为根节点。
  2. 在 Inorder 遍历中查找根节点,并确定左子树和右子树。
  3. 递归地处理左子树。
  4. 递归地处理右子树。
  5. 输出根节点的数据。

其中,步骤1到步骤4是递归的。当我们处理完整棵树时,即可得到 Postorder 遍历序列。

代码示例

下面是用 Python 语言实现该算法的代码示例:

def print_post_order(in_order, pre_order):
    if not in_order or not pre_order:
        return
    
    root = pre_order[0]
    root_index = in_order.index(root)

    print_post_order(in_order[:root_index], pre_order[1:root_index+1])
    print_post_order(in_order[root_index+1:], pre_order[root_index+1:])
    print(root, end=' ')
示例说明

这段代码中的 print_post_order 函数从 Inorder 和 Preorder 遍历打印 Postorder 遍历。如果 Inorder 和 Preorder 为空,则返回。否则,通过 Preorder 中的第一个节点选取根节点,并在 Inorder 中查找该根节点的位置和左右子树。然后,我们递归地处理在该节点左侧和右侧的 Inorder,以及在 Preorder 中与这些 Inorder 中的子树相对应的子序列。最后,我们输出当前节点的数据,即可得到 Postorder 遍历序列。