劍指OFFER之從上往下打印二叉樹(九度OJ1523)

題目描述:

從上往下打印出二叉樹的每一個節點,同層節點從左至右打印。html

 

輸入:

輸入可能包含多個測試樣例,輸入以EOF結束。
對於每一個測試案例,輸入的第一行一個整數n(1<=n<=1000, :n表明將要輸入的二叉樹元素的個數(節點從1開始編號)。接下來一行有n個數字,表明第i個二叉樹節點的元素的值。接下來有n行,每行有一個字母Ci。
Ci=’d’表示第i個節點有兩子孩子,緊接着是左孩子編號和右孩子編號。
Ci=’l’表示第i個節點有一個左孩子,緊接着是左孩子的編號。
Ci=’r’表示第i個節點有一個右孩子,緊接着是右孩子的編號。
Ci=’z’表示第i個節點沒有子孩子。node

 

輸出:

對應每一個測試案例,
按照從上之下,從左至右打印出二叉樹節點的值。算法

 

樣例輸入:
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

解題思路:

  很經典的廣度優先算法,沒什麼說的了。函數

  廣度優先算法看這裏測試

  算法思想:spa

  1 掃描最頂層的樹節點,把它的孩子節點放入隊列。code

  2 每次掃描隊列隊頭節點,仍把它的孩子加入到隊中,並按照先左孩子,再右孩子的順序,這樣保證一層的左右順序。htm

  3 直到隊列爲空。blog

//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 ****************************************************************/
相關文章
相關標籤/搜索