注意点:
在构造递归时候,注意左子树的个数,是mid-s2,而不是mid,并且这道题对于内存空间的申请没有运用到,不是很规范,直接开了数组进行初始化,然后直接用指针调用。
假如用malloc将会十分麻烦,一个一个结点地申请,最后一个结点一个结点的回收,还不如让操作系统自己回收,关于操作系统会不会自动回收,这篇博文讲的很明白
https://blog.csdn.net/WALLEZhe/article/details/69385474
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
struct Node{
Node *l;
Node *r;
char c;
}Tree[100];
int loc;
char a[30],b[30];
Node *creat(){
Tree[loc].l = Tree[loc].r = NULL;
return &Tree[loc++];
}
Node* build(int s1,int e1,int s2,int e2){
Node* root = creat();
root->c = a[s1];
int mid;
for(int i = s2; i <= e2; i++){
if(b[i] == a[s1]){
mid = i;
break;
}
}
//必须判断,“有停止的地方”
if(mid != s2)
root->l = build(s1+1,s1+mid-s2,s2,mid-1);
if(mid != e2)
root->r = build(s1+mid+1-s2,e1,mid+1,e2);
return root;
}
void postOrder(Node *T){
if(T->l!=NULL)
postOrder(T->l);
if(T->r!=NULL)
postOrder(T->r);
cout<<T->c;
}
int main(){
while(scanf("%s",&a)!=EOF){
scanf("%s",&b);
loc = 0;
int lena = strlen(a);
int lenb = lena;
Node *T = build(0,lena-1,0,lenb-1);
postOrder(T);
cout<<endl;
}
}```