ZCMU1507二叉树的先序建树和后序输出——建树与不建树的两种写法

【传送门】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;
}

猜你喜欢

转载自blog.csdn.net/qq_36314344/article/details/81538299