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

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

国际空间研究组织 | ISRO CS 2011 |问题 63

这是一个考试题目,属于ISRO (Indian Space Research Organization) CS (Computer Science) 2011的试题之一。本题目涉及到二叉树的遍历。

问题描述

给定一棵二叉树,其先序遍历为“ABDGCEFH”、中序遍历为“DGBAFCHE”,请问其后序遍历为何?

解题思路

在给定二叉树的先序遍历和中序遍历的情况下,可以通过建立二叉树的方式得到其后序遍历。具体操作如下:

  1. 从先序遍历中找到根节点,本题中是“A”,将其作为新建的二叉树的根节点;
  2. 在中序遍历中,以根节点为界限,将其分为左子树和右子树两部分;
  3. 根据左子树和右子树中的元素个数,可以确定先序遍历中的左子树和右子树的开始和结束索引,可以递归的建立子树;
  4. 最后得到的二叉树即为原始二叉树,其后序遍历即为左子树的后序遍历加上右子树的后序遍历再加上根节点。
解题代码

本题需要用到二叉树的节点类,可以使用Python的类来实现:

class Node:

    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data

建立二叉树的主要函数如下:

def build_tree(preorder, inorder):
    if not preorder or not inorder:
        return None
    root = Node(preorder[0])
    index = inorder.index(root.data)
    root.left = build_tree(preorder[1:index + 1], inorder[:index])
    root.right = build_tree(preorder[index + 1:], inorder[index + 1:])
    return root

此函数的参数是先序遍历和中序遍历的列表,返回建立的二叉树的根节点。

最后,使用递归的方式得到后序遍历序列:

def postorder_traversal(node):
    if node:
        postorder_traversal(node.left)
        postorder_traversal(node.right)
        print(node.data, end='')

完整代码如下:

class Node:

    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data


def build_tree(preorder, inorder):
    if not preorder or not inorder:
        return None
    root = Node(preorder[0])
    index = inorder.index(root.data)
    root.left = build_tree(preorder[1:index + 1], inorder[:index])
    root.right = build_tree(preorder[index + 1:], inorder[index + 1:])
    return root


def postorder_traversal(node):
    if node:
        postorder_traversal(node.left)
        postorder_traversal(node.right)
        print(node.data, end='')


preorder = "ABDGCEFH"
inorder = "DGBAFCHE"
root = build_tree(preorder, inorder)
postorder_traversal(root)

输出结果为:

DGEBHFCA

即本题的后序遍历序列为“DGEBHFCA”。