思路
具体操作流程:
先在前序数列中,找到根节点(也就是第一个节点),把根节点的值保存到 rtval 变量中。
由 rtval 反查中序排列对应值的下标,从后定位出根节点在中序数列的位置。
由根节点的位置,把数列一分为左右子树,再分别递归左右子树。
注意:前序数列的下一个节点是左子树的根(先递归左,再递归右),而后序数列前一个结点时右子树的根(先递归右,再递归左)。
本题是“ 给定序列构造二叉树 ”的修改版
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
using namespace std;
const int N=30;
char in[N],pre[N],post[N];
int p,cnt;
map<char,int> mp;
void dfs(int left,int right){//中序左右边界
if(left>right) return;//没数就退出
char c=pre[p];//在先序中获得一个根的值
int i=mp[c];//找到这个值在中序的位置
p++;//p移动一步
dfs(left,i-1);//递归左子树
dfs(i+1,right);//递归右子树
post[cnt++]=c;//cnt分配编号给post并存入
}
int main(){
scanf("%s%s",in,pre);//获取中序和先序
int n=strlen(in);//获取中序的长度
for(int i=0;i<n;i++){//进行中序的"值-下标"映射
mp[in[i]]=i;
}
dfs(0,n-1);//递归
for(int i=0;i<n;i++){//打印后序
printf("%c",post[i]);
}
printf("\n");
return 0;
}