【传送门】http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1507
【AC代码1】链式存储建树。因应局部指针T,采用&T,使用递归退出后T随之改变。
//zcmu1507 孩子表示法,用指针建树。建好树后再用递归输出后序序列。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105;
int i=-1;
char str[maxn]="AB#DE###C#F##";
struct node{
char data;
node *lt,*rt;
};
node *T;//T为全局变量,初始值为NULL
void make_tree(node * &T){//node*是整体,*不能少,申明T是node类型的指针。
//&T表示引用。形参T的变化,将使得对应实参同步变化。
//&万万不可少。
//否则,T只是局部变量,不能因为后续T的更新,退出递归后T随之更新。
if(str[++i]=='#')T=NULL;
else{
T=new node;//申请开一个新内存地址
T->data=str[i];
make_tree(T->lt);
make_tree(T->rt);
}
}
void printhx(node* T){
if(T){
printhx(T->lt);
printhx(T->rt);
printf("%c",T->data);
}
}
int main(){
scanf("%s",str);
make_tree(T);
printhx(T);
return 0;
}
【AC代码2】递归,不建树。
//zcmu1507 边读入边输出后序序列,没有建树。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int i=-1;
char str[105]="AB#DE###C#F##";
void mk(){
char c=str[++i];//根
if(c!='#'){
mk();//左
mk();//右
printf("%c",c);//注意,c是局部变量,切不可写成"printf("%c",c);",因为str[i]中的i是全局变量
}
else return;
}
int main(){
scanf("%s",str);
i=-1;
mk();
return 0;
}