题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度\le 8≤8)。
输入格式
22行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式
11行,表示一棵二叉树的先序。
输入输出样例
输入 #1复制
BADC BDCA
输出 #1复制
ABCD
中序遍历:左根右
后序遍历:左右根
先序遍历:根左右
因为后序遍历的每次遍历都是根结点,所以我们先把后序遍历的根结点输出,然后在中序遍历中找到根结点所在的位置,在中序遍历中根结点的前面就是左子树右边就是右子树,在后序中前面是左子树,中间是右子树,最后一个是根结点,所以我们每次就根据这些下标来分别遍历左子树和右子树(因为题目要求先序遍历是根左右)。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string zhong,hou;//中:左根右 后:左右根
void deal(int l1,int r1,int l2,int r2){
if(l1>r1||l2>r2)return ;//当中序或后序遍历完的时候退出
cout<<hou[r2];//没有遍历完就输出后序的最后一个(根结点
int pos=-1;
for(int i=0;i<=r1;i++){//找到中序里的根结点的位置
if(zhong[i]==hou[r2]){
pos=i;
break;
}
}
//在中序遍历中根结点的前面是左子树,根结点的后面是右子树
//在后序遍历中我们只能知道最后一个是根结点,但是我们可以根据中序求出来左子树的长度来确定在后序中左子树和右子树的长度,最终确定位置关系
deal(l1,pos-1,l2,l2+pos-1-l1);//左子树
deal(pos+1,r1,l2+pos-l1,r2-1);
}
int main(){
cin>>zhong>>hou;
int len=zhong.size();
deal(0,len-1,0,len-1);
return 0;
}