题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,且二叉树的节点个数 ≤8)。
输入格式
共两行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
共一行一个字符串,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
说明/提示
【题目来源】
NOIP 2001 普及组第三题
该题是由中序和后序推出前序,可以参考上一篇中序和前序推出后序,思路几乎一样。
不过,要得到前序遍历的结果,应该在遍历左右子树之前加上根节点。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
string qian,zhong,hou;
map<char,int> pos;
// zhong hou
void build(int l,int r,int a,int b)
{
if(l>r)
return ;
int root=hou[b];
int k=pos[root];
qian+=hou[b];
//左子树
build(l,k-1,a,a+k-1-l);
//右子树
build(k+1,r,a+k-1-l+1,b-1);
}
int main()
{
cin>>zhong;
cin>>hou;
int n=zhong.size();
for(int i=0;i<n;i++)
{
pos[zhong[i]]=i;
}
build(0,n-1,0,n-1);
cout<<qian<<endl;
return 0;
}