📜  门| GATE CS 2012 |问题10(1)

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

门| GATE CS 2012 |问题10

该题目要求编写一个程序,读入一组先序遍历和中序遍历结果,并输出树的后序遍历结果。这是一个典型的树的遍历问题,需要用到递归算法。

算法思路

根据先序遍历的结果,可以确定树的根节点;根据中序遍历的结果,可以确定树的左子树和右子树。对左子树和右子树分别递归处理,最终得到树的后序遍历结果。

具体实现可以参考以下步骤:

  1. 定义递归函数 postorder(preorder, inorder, start, end, i),其中 preorderinorder 分别为先序遍历和中序遍历的结果,startend 分别表示当前处理的子树在中序遍历结果中的起始位置和结束位置,i 表示当前递归到的节点在先序遍历结果中的下标;
  2. 在函数内部先处理边界情况,当子树为空时直接返回;
  3. 通过先序遍历结果可以获取当前子树的根节点,然后在中序遍历结果中查找对应位置,从而确定左子树和右子树的范围;
  4. 分别对左子树和右子树递归调用 postorder 函数,得到它们的后序遍历结果;
  5. 将当前节点添加到后序遍历结果的末尾;
  6. 返回后序遍历结果。
代码实现

下面是 Python 代码实现,实现了上述算法思路:

def postorder(preorder, inorder, start, end, i):
    if start > end:
        return []
    root = preorder[i]
    idx = inorder.index(root)
    left = postorder(preorder, inorder, start, idx-1, i+1)
    right = postorder(preorder, inorder, idx+1, end, i+1+len(left))
    return left + right + [root]

preorder = ['F', 'B', 'A', 'D', 'C', 'E', 'G', 'I', 'H']
inorder = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
result = postorder(preorder, inorder, 0, len(preorder)-1, 0)
print(result)

执行以上代码会输出树的后序遍历结果 ['A', 'C', 'E', 'D', 'B', 'H', 'I', 'G', 'F']