题面
【题目描述】
给出二叉树的先序遍历和中序遍历,求后序遍历。
【输入】
输入共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。字符串长度小于100100100。
【输出】
输出仅一行,表示树的后序遍历序列。
【样例输入】
abdec
dbeac
【样例输出】
debca
算法分析
二叉树有三种遍历方法:
先序遍历:(1)访问根节点;(2)先序遍历左子树;(3)先序遍历右子树。
中序遍历:(1)中序遍历左子树;(2)访问根节点;(3)中序遍历右子树。
后序遍历:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根节点。
已知先序遍历和中序遍历:

对于先序遍历,第一个结点为根节点aaa。接下来找出中序遍历的根结点,根据中序遍历的顺序,可以知道,根节点aaa左边为aaa的左子树,右边为aaa的右子树:

对于先序遍历,根节点aaa后紧跟的为aaa的左子树,左子树访问完之后为aaa的右子树。可以知道,aaa的左子树的结点数目是固定的,那么可以通过中序遍历根节点aaa左边的结点数目,即左子树的结点总数,从而在先序遍历中找到左子树的区间,对于样例,先序遍历中,根节点aaa后333个结点为aaa的左子树,剩下的为右子树。
因此左子树的先序遍历为:bdebdebde,左子树的中序遍历为:dbedbedbe;
右子树的先序遍历为:ccc,左子树的中序遍历为:ccc;
根结点为aaa。
按照同样的方法,继续对左右子树进行拆分。
假设先序遍历的下标区间为l1l_1l1~r1r_1

本文介绍了一种算法,该算法可以根据给定的二叉树先序遍历和中序遍历,求解其后序遍历。通过分析先序和中序遍历的特点,文章详细解释了如何确定根节点,划分左子树和右子树,以及如何递归地应用这一过程来生成后序遍历序列。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



