洛谷P1030 [NOIP 2001 普及组] 求先序排列
P1030 [NOIP 2001 普及组] 求先序排列
题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 $ \le 8$)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例 #1
输入 #1
BADC
BDCA
输出 #1
ABCD
说明/提示
【题目来源】
NOIP 2001 普及组第三题
P1030 [NOIP 2001 普及组] 求先序排列
这题的要点:后序遍历的最后一个字符就是根节点
那么找到这个根节点后再在把中序遍历分成根节点旁边的两份,递归遍历两边,不断输出根节点就好了
例:
ACGDBHZKX
CDGAHXKZB
后序遍历的根为B,
则中序遍历被分为了ACGD和HZKX两个部分
由这两个中序遍历可知他们分别在后序遍历中对应的子后序遍历分别为CDGA和HXKZ
就可以递归了
1.找根并输出
2.拆分后序遍历和中序遍历
3.递归1,2
ACcode:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
string middle,after;
void dfs(string mid,string af){ //中序和后序
if(mid.size()>0){
char c=af[af.size()-1]; //找根
cout<<c;
int p=mid.find(c);
//递归遍历分出的左右两部分
dfs(mid.substr(0,p),af.substr(0,p));
dfs(mid.substr(p+1),af.substr(p,mid.size()-p-1));
}
}
int main(){
ios::sync_with_stdio(0);
cin>>middle>>after;
dfs(middle,after);
return 0;
}

浙公网安备 33010602011771号