從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
輸入可能包含多個測試樣例,輸入以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
****************************************************************/