1. 程式人生 > >【二叉樹】 先,中,後序遍歷輸出

【二叉樹】 先,中,後序遍歷輸出

二叉樹的建立與遍歷(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<cstdio>
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");
}