Description
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入描述 Input Description
两个字符串,分别是中序和后序(每行一个)
输出描述 Output Description
一个字符串,先序
样例输入 Sample Input
BADC
BDCA
样例输出 Sample Output
ABCD
数据范围及提示 Data Size & Hint
这道题就是裸裸的递归题目,可以用来复习数据结构的基础知识用,如果我们知道了一个二叉树的遍历方式有:1,先序,2.中序,3.后序,
这三个先后都是对于根节点来说的,也就是说,
如果先序遍历的话,输出顺序是这样的,根节点,左子树,右子树。
如果中序遍历的话,输出顺序是这样的,左子树,根节点,右子树
如果是后序遍历的话,输出顺序是这样的,左子树,右子数,根节点。
所以根据这个特点,对于后序遍历的根节点,我们可以做这样的处理,他的最后一个字符就是该二叉树的根节点root,
然后再找到中序遍历中,该字符所出现的位置,把中序遍历分成了两个部分,左边为左子树,右边为右子树
然后依次用这个方法不断的递归,直到该节点为叶子节点为止了~
代码:
# include<cstdio>
# include<iostream>
using namespace std;
void fun(string s1,string s2)
{
int m=s1.find(s2[s2.size()-1]);
string str1,str2,str3,str4;
str1.assign(s1,0,m);
str2.assign(s1,m+1,s1.size()-m-1);
str3.assign(s2,0,str1.size());
str4.assign(s2,str1.size(),str2.size());
cout<<s2[s2.size()-1];
if( str1.size()>=1 )
fun(str1,str3);
if( str2.size()>=1 )
fun(str2,str4);
}
int main(void)
{
string s1,s2;
while( cin>>s1>>s2 )
{
fun(s1,s2);
cout<<endl;
}
return 0;
}