题目链接:登录—专业IT笔试面试备考平台_牛客网
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度 ≤ 8)。
输入描述
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出描述
1行,表示一棵二叉树的先序。
示例
输入
BADC
BDCA
输出
ABCD
思路
利用递归思路,逐步递归,得到子树的根节点,按照题目要求调整输出位置。在本题中要求先序排列,即父左
右的顺序进行输出。因此先输出根节点,再递归左子树,最后递归右子树。 其中递归结束标志为子树长度为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)