【二叉树】 先,中,后序遍历输出

二叉树的建立与遍历(binary-tree)

题目描述
给出一棵二叉树,分别输出先序、中序、后序遍历结果。

输入
第1行:结点数n(1<=n<=100)

以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.

输出
第1行:树根

第2行:先序遍历结果,数字间用1个空格分开。

第3行:中序遍历结果,数字间用1个空格分开。

第4行:后序遍历结果,数字间用1个空格分开。

样例输入
8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0

 

分析:

               这是一道二叉树基础(水)题,首先建树,显然此题用结构体储存比较方便

         struct node

         {

                int father;//父亲结点

               int l,r;//左儿子,右儿子

         }tree[1000];

 

        那么怎么找根节点? 从样例可以看出,根节点3不是任何人的儿子

           也就是说,根节点的父亲为0,一个for循环就能找到了

         那么如何遍历? 可见每个节点都要被访问,那么当这个节点被访问时,是先遍历左子树?先输出?最后输出?

        这就是先序,中序,后序的区别了,那么递归边界就是当 该节点为空 时结束递归

 

代码如下:

#include
struct node
{
	int f,l,r;
}t[1000];
void xdfs(int a)
{
	if(a)
	{
		printf("%d ",a);
		xdfs(t[a].l);
		xdfs(t[a].r);
	}
}
void zdfs(int a)
{
	if(a)
	{
		zdfs(t[a].l);
		printf("%d ",a);
		zdfs(t[a].r);
	}
}
void hdfs(int a)
{
	if(a)
	{
		hdfs(t[a].l);
		hdfs(t[a].r);
		printf("%d ",a);
	}
}
int main()
{
	//freopen("binary-tree.in","r",stdin);
	//freopen("binary-tree.out","w",stdout);
	int n,i,x,y,z;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		t[y].f=x,t[z].f=x,t[x].l=y,t[x].r=z;
	}
	for(i=1;i<=n;i++)
		if(!t[i].f) {printf("%d\n",i);break;}
	xdfs(i);
	printf("\n");
	zdfs(i);
	printf("\n");
	hdfs(i);
	printf("\n");
}


 

 

你可能感兴趣的:(二叉树)