二叉树的序遍历
时间限制: 1 s
空间限制: 32000 KB
题目等级 : 白银 Silver
题目描述 Description
求一棵二叉树的前序遍历,中序遍历和后序遍历
输入描述 Input Description
第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。
输出描述 Output Description
输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。
样例输入 Sample Input
5
2 3
4 5
0 0
0 0
0 0
样例输出 Sample Output
1 2 4 5 3
4 2 5 1 3
4 5 2 3 1
数据范围及提示 Data Size & Hint
n <= 16
首先要清楚,遍历顺序:
前序:根左右
中序:左根右
后序:左右 根
清楚遍历顺序后,创建个树,从根节点进行查询就OK了
# include <stdio.h>
typedef struct node{
int root;
int left;
int right ;
}node;
node nod[20];
void pre_order(node tree,int i) //前序输出,值表示,要输出的树 和树的编号 如果是根就输入 nod【1】 , 1
{
printf("%d ",i); //前序先输出根
if(tree.left!=0)//判断有无左孩子,有就进行输出,并查找
{
pre_order(nod[tree.left],tree.left);
}
if(tree.right!=0)//判断有无右孩子,有就进行输出,并查找
{
pre_order(nod[tree.right],tree.right);
}
}
void infix_order(node tree,int i)//中序遍历同上
{
if(tree.left!=0)
{
infix_order(nod[tree.left],tree.left);
}
printf("%d ",i);
if(tree.right!=0)
{
infix_order(nod[tree.right],tree.right);
}
}
void after_order(node tree,int i)//后序遍历同上
{
if(tree.left!=0)
{
after_order(nod[tree.left],tree.left);
}
if(tree.right!=0)
{
after_order(nod[tree.right],tree.right);
}
printf("%d ",i);
}
int main (void)
{
int n ,l, r,a[32]={0};
int i , j ,x;
scanf("%d",&n);
nod[1].root=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&l,&r);
nod[i].left=l;
nod[i].right=r;
nod[l].root=i;
nod[r].root=i;
}
pre_order(nod[1],1);
printf("\n");
infix_order(nod[1],1);
printf("\n");
after_order(nod[1],1);
return 0;
}