從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
輸入可能包含多個測試樣例,輸入以EOF結束。
對於每個測試案例,輸入的第一行一個整數n(1<=n<=1000, :n代表將要輸入的二叉樹元素的個數(節點從1開始編號)。接下來一行有n個數字,代表第i個二叉樹節點的元素的值。接下來有n行,每行有一個字母Ci。
Ci=’d’表示第i個節點有兩子孩子,緊接著是左孩子編號和右孩子編號。
Ci=’l’表示第i個節點有一個左孩子,緊接著是左孩子的編號。
Ci=’r’表示第i個節點有一個右孩子,緊接著是右孩子的編號。
Ci=’z’表示第i個節點沒有子孩子。
對應每個測試案例,
按照從上之下,從左至右打印出二叉樹節點的值。
7 8 6 5 7 10 9 11 d 2 5 d 3 4 z z d 6 7 z z
8 6 10 5 7 9 11
很經典的廣度優先算法,沒什麼說的了。
廣度優先算法看這裡
算法思想:
1 掃描最頂層的樹節點,把它的孩子節點放入隊列。
2 每次掃描隊列隊頭節點,仍把它的孩子加入到隊中,並按照先左孩子,再右孩子的順序,這樣保證一層的左右順序。
3 直到隊列為空。
//main()中的代碼 findTree(a,n,1); while(begin_q != end_q){ findTree(a,n,Quene[begin_q++]); } //掃描函數 void findTree(treeArr *a,int n,int j){ if(j<=n){ result[top_result++]=a->arr[j].num; } if(a->arr[j].lchild != 0){ Quene[end_q++] = a->arr[j].lchild; } if(a->arr[j].rchild != 0){ Quene[end_q++] = a->arr[j].rchild; } }
#include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXSIZE 1005 typedef struct treenode{ int num; int lchild; int rchild; }Tree; typedef struct treearr{ struct treenode arr[MAXSIZE]; }treeArr; int Quene[MAXSIZE]={0}; int begin_q,end_q; int result[MAXSIZE]={0}; int top_result; void findTree(treeArr *a,int n,int j); int main(){ int n,i; char c; int n1,n2; while(scanf("%d",&n)!=EOF && n>=1 && n<=1000){ treeArr *a = (treeArr *)malloc(sizeof(treeArr)); memset(&Quene,0,sizeof(int)*MAXSIZE); memset(&result,0,sizeof(int)*MAXSIZE); begin_q=0; end_q = 0; top_result = 0; for(i=0;i<MAXSIZE;i++){ a->arr[i].num = 0; a->arr[i].lchild = 0; a->arr[i].rchild = 0; } for(i=1;i<=n;i++){ scanf("%d",&a->arr[i].num); } for(i=1;i<=n;i++){ scanf("\n%c",&c); if(c == 'd'){ scanf("%d %d",&n1,&n2); a->arr[i].lchild = n1; a->arr[i].rchild = n2; }else if(c == 'l'){ scanf("%d",&n1); a->arr[i].lchild = n1; }else if(c == 'r'){ scanf("%d",&n1); a->arr[i].rchild = n1; }else{ } } findTree(a,n,1); while(begin_q != end_q){ //printf("findtree --- begin_q %d end_q %d\n",begin_q,end_q ); findTree(a,n,Quene[begin_q++]); } for(i=0;i<n-1;i++){ printf("%d ", result[i]); } printf("%d\n", result[n-1]); } return 0; } void findTree(treeArr *a,int n,int j){ if(j<=n){ result[top_result++]=a->arr[j].num; } if(a->arr[j].lchild != 0){ Quene[end_q++] = a->arr[j].lchild; } if(a->arr[j].rchild != 0){ Quene[end_q++] = a->arr[j].rchild; } } /************************************************************** Problem: 1523 User: xhalo Language: C Result: Accepted Time:0 ms Memory:920 kb ****************************************************************/