普通的写法:
//Author:PanDaoxi
#include <iostream>
#include <cstring>
using namespace std;
char pre[101]; //先序
char in[101]; //中序
struct node{
char value; //节点值
int lchild,rchild; //左右节点
}data[1001];
int root,cnt; //根位置 cnt节点编号
int N; //节点个数
void posOrder(int bt){
if(bt){
posOrder(data[bt].lchild);
posOrder(data[bt].rchild);
cout<<data[bt].value; //后序输出
}
return;
}
//二叉树创建函数
int create(int preL,int preR,int inL,int inR){
int bt=0;
if(preL>preR) bt=0; //递归
else{
bt=++cnt; //节点编号增加
int m; //中序根的下标
for(m=inL;m<=inR;m++){
//找到根并存留
if(in[m]==pre[preL]) break;
}
data[bt].value=in[m]; //根给data[bt]
int numLeft=m-inL; //左子树的个数
data[bt].lchild=create(preL+1,preL+numLeft,inL,m-1);
data[bt].rchild=create(preL+numLeft+1,preR,m+1,inR);
}
return bt;
}
int main(){
cin>>pre>>in;
N=strlen(pre);
root=create(0,N-1,0,N-1);
posOrder(root);
return 0;
}
智慧的写法:
(逻辑性较强)
//Author:PanDaoxi
#include <iostream>
#include <cstring>
using namespace std;
string s1,s2;
//后序遍历
void set_up(int l1,int r1,int l2,int r2){
int m; //中序根的位置
for(m=l2;m<=r2;m++){
if(s2[m]==s1[l1]) break;
}
if(m>l2) set_up(l1+1,l1+(m-l2),l2,m-1); //左输出
if(m<r2) set_up(l1+(m-l2)+1,r1,m+1,r2); //右输出
cout<<s1[l1]; //输出根
return;
}
int main(){
cin>>s1>>s2;
set_up(0,s1.length()-1,0,s2.length()-1); //后序遍历,输出
return 0;
}