【二叉樹】 先,中,後序遍歷輸出
阿新 • • 發佈:2019-02-18
二叉樹的建立與遍歷(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"); }