📜  门| GATE-CS-2002 |第 44 题(1)

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

题目介绍

本题来自于《GATE-CS-2002》的第44题,要求针对给定的数据结构进行遍历操作。

题目描述

设一棵二叉树的先序遍历序列为:$1, 2, 4, 5, 3, 6, 7$,中序遍历序列为:$4, 2, 5, 1, 6, 3, 7$。则这棵二叉树的后序遍历序列是什么?

解题思路

首先要知道二叉树的先序遍历、中序遍历和后序遍历的定义:

  • 先序遍历:先访问根节点,再访问左子树,最后访问右子树。
  • 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
  • 后序遍历:先访问左子树,再访问右子树,最后访问根节点。

由于本题已给出先序遍历序列和中序遍历序列,因此可以按以下步骤进行求解:

  1. 根据先序遍历序列可以得到根节点为1。
  2. 根据中序遍历序列可以将整棵二叉树分成两部分:左子树和右子树。其中,根节点左边为左子树,右边为右子树。由于左子树的节点数为3,因此在先序遍历序列中,从根节点往后,前3个节点为左子树的先序遍历序列,即$2,4,5$。那么右子树的先序遍历序列即为$3,6,7$。
  3. 由于左子树的中序遍历序列为$4,2,5$,因此可以按照步骤1和步骤2的方法对左子树进行递归求解,可以得到左子树的后序遍历序列为$4,5,2$。
  4. 同理,右子树的中序遍历序列为$6,3,7$,可以按照步骤1和步骤2的方法对右子树进行递归求解,可以得到右子树的后序遍历序列为$6,7,3$。
  5. 由于后序遍历的定义为先访问左子树,再访问右子树,最后访问根节点。因此将左子树的后序遍历序列和右子树的后序遍历序列连接起来,再加上根节点即可得到整棵树的后序遍历序列,即$4,5,2,6,7,3,1$。

参考代码

def post_order(in_order, pre_order):
    if not in_order:
        return []
    root = pre_order[0]
    root_index = in_order.index(root)
    left_in_order = in_order[:root_index]
    right_in_order = in_order[root_index + 1:]
    left_pre_order = pre_order[1:len(left_in_order) + 1]
    right_pre_order = pre_order[len(left_in_order) + 1:]
    left_post_order = post_order(left_in_order, left_pre_order)
    right_post_order = post_order(right_in_order, right_pre_order)
    return left_post_order + right_post_order + [root]
    
in_order = [4, 2, 5, 1, 6, 3, 7]
pre_order = [1, 2, 4, 5, 3, 6, 7]
post_order = post_order(in_order, pre_order)
print(post_order)  # 输出结果:[4, 5, 2, 6, 7, 3, 1]

以上python代码可以求出该二叉树的后序遍历序列,输出结果为$[4, 5, 2, 6, 7, 3, 1]$。