时间限制:1s 空间限制:32000KB题目等级:白银 silver
题目描述
求一棵二叉树的前序遍历、中序遍历和后序遍历。
输入描述
第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第 i 行的2个整数Li和Ri分别表示编号为 i 的节点的左孩子编号和右孩子编号。
输出描述
输出一共三行,分别为前序遍历、中序遍历和后序遍历。编号之间用空格隔开。
样例输入
5
2 3
4 5
0 0
0 0
0 0
样例输出
1 2 4 5 3
4 2 5 1 3
4 5 2 3 1
数据范围及提示
n<=16
BUG检讨:
一开始忽略了typedef struct和struct的区别,使用了typedef而未声明具体对象,导致一直编译错误。特在此备注!
错误的建树姿势:
typedef struct node{
int l,r;
}bt[MAX_LENGTH];//typedef用于声明类型,不能拿来定义具体的数组
正确的建树姿势①:
typedef struct node{
int l,r;
}BTree;
BTree bt[MAX_LENGTH];//对象具体化,定义BTree类型的二叉树数组bt
正确的建树姿势②:
如AC代码
AC代码如下:
#include <stdio.h>
const int MAX_LENGTH=17;
struct node{
int l,r;
}bt[MAX_LENGTH];
//访问当前节点(根)
void visit( int root ){
printf("%d ",root);
}
//前序遍历
void pre_traverse( int root ){
if( !root ) return;
visit( root );
pre_traverse( bt[root].l );
pre_traverse( bt[root].r );
}
//中序遍历
void in_traverse( int root ){
if( !root ) return;
in_traverse( bt[root].l );
visit( root );
in_traverse( bt[root].r );
}
//后序遍历
void post_traverse( int root ){
if( !root ) return;
post_traverse( bt[root].l );
post_traverse( bt[root].r );
visit( root );
}
int main()
{
int n;
scanf("%d",&n);
for( int i=1;i<=n;i++ ){
scanf("%d%d",&bt[i].l,&bt[i].r);
}
pre_traverse( 1 ); printf("\n");
in_traverse( 1 ); printf("\n");
post_traverse( 1 ); printf("\n");
return 0;
}