标签:c style class blog code java
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
输入可能包含多个测试样例,输入以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 ****************************************************************/
剑指OFFER之从上往下打印二叉树(九度OJ1523),布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/xing901022/p/3774846.html