二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列

该博客介绍了如何根据二叉树的前序和中序遍历序列,利用递归算法构建二叉树并输出其后序遍历序列。解题思路包括寻找根节点在中序遍历中的位置,根据位置划分左右子树,再分别对子树进行递归操作,最终得到后序遍历序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。 

输入描述:

两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。

二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

输出描述:

可能有多组样例,对于每组样例输出一行为后序遍历的字符串。

exp:

input                                  output

    ABC                                BCA

    BAC

    FDXEAG                         XEDGAF

    XDEFAG 

解题思路:

二叉树通过先序遍历和中序遍历以推出后序遍历序列
首先把输入的中序遍历和先序遍历存在两个字符串中
通过递归方法建立二叉树。
如:
前序:FDXEAG
中序:XDEFAG
记前序首位为l1,末位为r1
记中序首位为l2,末位为r2
分析:
前序遍历的第一个结点必然是二叉树的根结点(也可以是部分分支的根部节点,每一次调用建树函数可以唯一确定一个根部节点)
在中序遍历中找到这一节点位置记为i
记中序遍历首位开始到i的前一位【字符串长度】为len1=i-l2
记i后一位到中序遍历末位【字符串长度】为len2=r2-i

判断:如果len1>0 即有左子树情况 则对左子树部分递归调用建树函数(右子树同理)

如上例输入中,F为前序的第一个节点,此时在中序遍历中寻找F,在第4位,从而XDE为F的左子树的中序遍历,AG为F的右子树的中序遍历

XDE长度为3,即F后面连续的3位为F左子树的前序遍历,前序遍历序列倒数2位为F右子树的前序遍历

每次调用递归函数时,将上一次调用函数分出来的左右子树视为一个新的二叉树,按规则继续建树

建立完一棵树后再后序遍历输出结果即可。

 1 #include<stdio.h>
 2 #include<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值