题目描述
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8。
输入格式:
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。
输出格式:
1行,表示一棵二叉树的先序。
输入样例1:
BADC
BDCA
输出样例1:
ABCD
解题思路
就是一个先中后序遍历的问题,看代码吧,有标注示。
代码
#include <iostream>
#include <cstring>
using namespace std;
string a;
string b;
void xian(int zl,int zr,int hl,int hr){
if(zl>zr){//如果最左大于最右,也就是没有子节点以及这个节点了,就直接返回
return ;
}
cout<<b[hr];//如果最左小于等于最右,也就是还有自己的节点或之后的节点,就输出这个节点
if(zl==zr){//等于也要返回
return ;
}
int mid;//mid为根节点,在中序遍历中也是中点
for(mid=zl;mid<=zr;mid++){
if(a[mid]==b[hr]){//如果是跟节点,就赋值为跟节点
break;
}
}
int cntl=mid-zl;//左边有多少个节点
int cntr=zr-mid;//右边有多少个节点
xian(zl,mid-1,hl,cntl+hl-1);//继续深度遍历
xian(mid+1,zr,hr-cntr,hr-1);//继续深度遍历
}
int main() {
cin>>a>>b;
xian(0,a.length()-1,0,b.length()-1);//中序遍历现有的数列位0~a.length()-1,后序遍历现有0~b.length()-1
return 0;
}