题目描述
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
输入
共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
输出
一行,表示树的后序遍历序列。
样例输入
abdec
dbeac
样例输出
debca
分析:
本题为二叉树的遍历,可以使用递归来推左右子树,
核心代码如下:
void tree(int l1,int r1,int l2,int r2)
{
int i;
for(i=l2;i<=r2;i++){
if(a[r1]==b[i]){
tree(l1+1,l1+i-l2,l2,i-1);
tree(l1+i-l2+1,r1,i+1,r2);
cout<<a[l1];
}
}
}
完整代码:
/*
Name:gsr
Date:04/03/23
number:1582 Problem S 求后序遍历
*/
#include<bits/stdc++.h>
using namespace std;
string a,b;
int lena,lenb;
void tree(int l1,int r1,int l2,int r2);
int main(){
cin>>a>>b;
lena=a.size();
lenb=b.size();
tree(0,lena-1,0,lenb-1);
}
void tree(int l1,int r1,int l2,int r2)
{
int i;
for(i=l2;i<=r2;i++){
if(a[l1]==b[i]){
tree(l1+1,l1+i-l2,l2,i-1);
tree(l1+i-l2+1,r1,i+1,r2);
cout<<a[l1];
return ;
}
}
}
/*
Name:gsr
Date:04/03/23
number:1582 Problem S 求后序遍历
*/
#include<bits/stdc++.h>
using namespace std;
string a,b;
int lena,lenb;
void tree(int l1,int r1,int l2,int r2);
int main(){
cin>>a>>b;
lena=a.size();
lenb=b.size();
tree(0,lena-1,0,lenb-1);
}
void tree(int l1,int r1,int l2,int r2)
{
int i;
for(i=l2;i<=r2;i++){
if(a[l1]==b[i]){
tree(l1+1,l1+i-l2,l2,i-1);
tree(l1+i-l2+1,r1,i+1,r2);
cout<<a[l1];
return ;
}
}
}