题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA输出 #1复制
ABCD说明/提示
【题目来源】
NOIP 2001 普及组第三题
代码:
#include <bits/stdc++.h>
using namespace std;
string a,b;//存中序排列和后序排列
void dfs(string x,string y){
if(x.size()<=0) return;//如果x不存在了,那说明左子树或右子树搜完了,返回
cout<<y[y.size()-1];//后序排列的最后一个字母是根节点
int pos=x.find(y[y.size()-1]);//找到中序排列的根节点位置
dfs(x.substr(0,pos),y.substr(0,pos));//搜左子树,注意x.substr(0,pos) 0代表下标pos代表截取长度
dfs(x.substr(pos+1,x.size()-pos-1),y.substr(pos,y.size()-pos-1));//搜右子树
}
int main(){
cin >> a >> b;
dfs(a,b);
return 0;
}
/*
中序遍历:左根右
后序遍历:左右根
样例分析:
中序排列:BADC
后序排列:BDCA
1.找到后序排列的最后一个字母,根节点A
2.在中序排列中找到A的下标pos 1
3.搜左子树 截取中序排列A前面的字母即从下标0截取长度为pos 1的字符串B,
截取后序排列从0开始截取同样长度pos 1的字符串B
得到左子树的一个根节点为B
输出B
截取后s.size()<=0 return;
左子树搜完 为B
4.搜右子树 截取中序排列A后面的字母即从下标pos+1 2截取长度为x.size()-pos-1的字符串DC
截取后序排列从pos 1开始截取长度为y.size()-pos-1的字符串DC
得到右子树的一个根节点C
输出C
截中D
截后D
输出D
截取后s.size()<=0 return;
右子树搜完 为CD
5.结果 ABCD
*/