P1030 树的先序 中序 后序遍历
[NOIP2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 $ \le 8$)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
样例 #1
样例输入 #1
BADC
BDCA
样例输出 #1
ABCD
利用 后序遍历 根在最后的特点 在中序中找到对应根 根据中序算出左右子树的大小 然后算出后序中左右子树的范围 递归 输出根节点 遍历左右子树即可
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
void dfs(int l1,int r1,int l2,int r2) { // s2[r2] is the root
if(l1==r1) {
cout<<s1[l1];
return ;
}
if(l1>r1||l2>r2)return ;
cout<<s2[r2];
int pos;
for(int i=l1; i<=r1; i++)
if(s1[i]==s2[r2]) {
pos=i;
break;
}
dfs(l1,pos-1,l2,r2-r1+pos-1);
dfs(pos+1,r1,r2-r1+pos,r2-1);
}
signed main() {
ios::sync_with_stdio(false);
cin>>s1>>s2;
int l1=s1.size(),l2=s2.size();
s1=" "+s1,s2=" "+s2;
dfs(1,l1,1,l2);
return 0;
}