Python二叉树已知先序+中序求后序、已知中序+后序求先序

题目链接:登录—专业IT笔试面试备考平台_牛客网

题目描述

    给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤ 8)。 

输入描述 

2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

 输出描述

1行,表示一棵二叉树的先序。

示例 

输入 

BADC
BDCA

输出 

ABCD

思路 

利用递归思路,逐步递归,得到子树的根节点,按照题目要求调整输出位置。在本题中要求先序排列,即父\rightarrow\rightarrow右的顺序进行输出。因此先输出根节点,再递归左子树,最后递归右子树。 其中递归结束标志为子树长度为0,本题已知中序+后序,因此首先根据后序确定根节点为最后一个,再通过遍历在中序中找到根节点,主要目的是将左子树和右子树进行拆分分别进行递归。

代码 

def ToPreOrder(In,Post):
    length = len(Post)
    if length == 0: #递归结束标志
        return

    root = Post[-1] #根据后序找到根节点
    for i in range(length): 
        if root == In[i]: #在中序中找到根节点
            break

    print(root, end = '') #求先序,则先输出根节点再进行递归
    ToPreOrder(In[:i],Post[:i])
    ToPreOrder(In[i + 1:],Post[i:-1])

In = input()
Post = input()
ToPreOrder(In,Post)

回顾总结

      二叉树的一个基本概念。注意一点,已知先序+后序是无法确定出一棵树的,已知中序是必要条件。

 情形一:已知先序+中序,求后序

def ToPostOrder(Pre,In):
    length = len(Pre)
    if length == 0: #递归结束标志
        return
    
    root = Pre[0] #根据先序找到根节点
    for i in range(length):
        if root == In[i]: #在中序中找到根节点
            break

    ToPostOrder(Pre[1:i + 1],In[:i])
    ToPostOrder(Pre[i + 1:],In[i + 1:])
    print(root, end = '')  # 求后序,则先进行递归再输出根节点

Pre = input()
In = input()
ToPostOrder(Pre,In)

  情形二:已知中序+后序,求先序

def ToPreOrder(In,Post):
    length = len(Post)
    if length == 0: #递归结束标志
        return
    root = Post[-1] #根据后序找到根节点
    for i in range(length):
        if root == In[i]: #在中序中找到根节点
            break
    print(root,end = '') #求先序,则先输出根节点再进行递归
    ToPreOrder(In[:i],Post[:i])
    ToPreOrder(In[i + 1:],Post[i:-1])

In = input()
Post = input()
ToPreOrder(In,Post)

你可能感兴趣的:(python,数据结构)