【题解】求后序遍历(二叉树遍历,递归)

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

题面

【题目描述】
给出二叉树的先序遍历和中序遍历,求后序遍历。
【输入】
输入共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。字符串长度小于100100100
【输出】
输出仅一行,表示树的后序遍历序列。
【样例输入】

abdec
dbeac

【样例输出】

debca

算法分析

二叉树有三种遍历方法:
先序遍历:(1)访问根节点;(2)先序遍历左子树;(3)先序遍历右子树。
中序遍历:(1)中序遍历左子树;(2)访问根节点;(3)中序遍历右子树。
后序遍历:(1)后序遍历左子树;(2)后序遍历右子树;(3)访问根节点。

已知先序遍历和中序遍历:
在这里插入图片描述
对于先序遍历,第一个结点为根节点aaa。接下来找出中序遍历的根结点,根据中序遍历的顺序,可以知道,根节点aaa左边为aaa的左子树,右边为aaa的右子树:
在这里插入图片描述
对于先序遍历,根节点aaa后紧跟的为aaa的左子树,左子树访问完之后为aaa的右子树。可以知道,aaa的左子树的结点数目是固定的,那么可以通过中序遍历根节点aaa左边的结点数目,即左子树的结点总数,从而在先序遍历中找到左子树的区间,对于样例,先序遍历中,根节点aaa333个结点为aaa的左子树,剩下的为右子树。
因此左子树的先序遍历为:bdebdebde,左子树的中序遍历为:dbedbedbe
右子树的先序遍历为:ccc,左子树的中序遍历为:ccc
根结点为aaa
按照同样的方法,继续对左右子树进行拆分。
假设先序遍历的下标区间为l1l_1l1~r1r_1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值