当前位置:首页 > 数据结构 > 二叉树 > 正文
SSOJ2467二叉树输出
4216+

题目大意:给出一棵二叉树的先序遍历和中序遍历,输出树的凹入表示法。

题目描述

树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点 的长并等于它的左右子树的长度之和。
一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:
每行输出若干个结点字符(相同字符的个数等于该结点长度),
如果该结点有左子树就递归输出左子树;
如果该结点有右子树就递归输出右子树。
假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。

输入

输入共两行,每行是由字母组成的字符串(一行的每个字符都是唯一的), 分别表示二叉树的先序遍历和中序遍历的序列。

输出

输出的行数等于该树的结点数,每行的字母相同。

样例输入

ABCDEFG 
CBDAFEG

样例输出

AAAA
BB
C
D
EE
F
G

解题思路

知道二叉树的中序遍历以及其他序遍历中的任何一种,就可以确定一棵二叉树,如由先序遍历和中序遍历确定二叉树,我们可以这样操作:由先序遍历可以快速找到根结点,然后在中序遍历找到根结点的位置,将中序遍历分成两段,这两段分别代表根结点的左子树和右子树,只要我们在先序遍历也将其分成左子树和右子树,就可以分别求这两个子树了。求子树跟求整棵树是同一个问题,至少规模不一样而已,因此可以递归求解。

树的凹入表示法,关键是求各个结点的长度,由于每个非叶子结点的长度,等于儿子结点的长度之和,故需要先求儿子长度,再求父母节点长度,需要用到后序遍历。在求出各个结点的长度后,逐个输出即可。

下面讲解一下如何从先序遍历和中序遍历得到后序遍历:从根结点(先序遍历中编号为k)开始搜索,将中序遍历(l到r)以根结点为边界划分成两半,设根结点在中序遍历为i,那么左子树是l到i-1,右子树是i+1到r,如果子树不为空,递归搜索求解;边界条件是当序列长度为1时,即l==r,长度为1。

程序中,函数返回中序遍历l到r序列中根结点的长度,k为先序遍历根结点编号。仔细思考一下,不难发现,搜索的顺序就是先序遍历的顺序,故每找到一个根结点,k++即可。

程序实现

SSOJ2467二叉树输出:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!