pre先序序列
mid 中序序列
通过先序找到当前子树根节点(第一个点),再用中序找到根,分出左右子树,不断递归下去。
#include <cstdio>
#include <cstdlib>
#include <cstring>
char pre[100],mid[100];
struct Node {
char val;
Node *lch,*rch;
Node():lch(NULL),rch(NULL){}
};
Node *build(int pl,int pr,char *pre,int ml,int mr,char *mid) {
if (pr < pl || mr < ml) return NULL;
// printf("%d %d %d %d\n",pl,pr,ml,mr);
for (int i = ml; i <= mr; i++)
if (mid[i] == pre[pl]) {
Node * T = new Node;
T->val = mid[i];
T->lch = build(pl+1,pl+i-ml,pre,ml,i-1,mid);
T->rch = build(pl+i-ml+1,pr,pre,i+1,mr,mid);
return T;
}
return NULL;
}
void Tra(Node *T) {
if (T == NULL) return;
printf("%c",T->val);
Tra(T->lch);
Tra(T->rch);
}
int main() {
scanf("%s%s",pre,mid);
int len = strlen(pre);
Node *T = build(0,len-1,pre,0,len-1,mid);
Tra(T);
return 0;
}