问题描述
给定一棵二叉树的前序遍历和中序遍历序列,用你所熟悉的程序设计语言生成该二叉树,并将其后序遍历打印出来。为便于编程,二叉树的结点用单个大写英文字母表示,且结点互不重复。比如,输入前序遍历序列为DBACPMZX,中序遍历序列为ABCDMPXA,应生成的二叉树结构如下图所示:
(图图出走啦~~~~~)
应输出的后序遍历序列为ACBMXZPD
输入格式
两行两个大写字母字符串,分别代表前序和中序遍历
输入格式
一行表示后序遍历
样例输入
DBACPMZX
ABCDMPXZ
样例输出
ACBMXZPD
解题思路
解题思路和这个挺像的。
(4条消息) 蓝桥杯求先序排列python_死也不承认自己笨的博客-CSDN博客https://blog.csdn.net/swing123lovecoding/article/details/123229999?spm=1001.2014.3001.5501不同的是,求后序排列是左右根,这个思路不是先输出根么。我们可以以根、右子树、左子树的顺序将根压到栈中,因为栈是后进先出。最后全部出栈,输出顺序就是左子树、右子树、根了。
代码
s1 = input()#前序
s2 = input()#中序
list1 = []
root = ""
def postOrder(s1,s2):
if(s1!=""):
len_s = len(s1)
root = s1[0]
list1.append(s1[0])#根
index_s = s2.find(root)
s2_left = s2[0:index_s]
s2_right = s2[index_s+1:len_s]
# print("s2_left=",s2_left)
# print("s2_right=",s2_right)
len_left = len(s2_left)
len_right = len(s2_right)
s1_left = s1[1:len_left+1]
s1_right = s1[len_left+1:len_s]
# print("s1_left=",s1_left)
# print("s1_right=",s1_right)
if(len_right>0):
postOrder(s1_right,s2_right)#右子树
if (len_left > 0):
postOrder(s1_left, s2_left)#左子树
postOrder(s1,s2)
for i in range(len(list1)):
print(list1.pop(),end='')
print()