317输出完全二叉树的某一层

发布时间 2023-12-23 12:03:51作者: xzdmzrc

题目:输出完全二叉树的某一层

问题描述

对一棵完全二叉树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。

输入格式

        输入有多组数据。

每组数据第一行输入一个结点数n(1<=n<=1000),第二行将树中的这n个节点依次输入(每个结点存储的数据是一个数字),n个结点编号方式是层间从上到下、层内从左到右依次编号;第三行输入一个d代表深度。

当n=0时,表示输入结束。

输出格式

        每组数据在一行上输出该树中第d层的所有节点,节点间用空格隔开。每组数据输出完成后要换行。

样例输入

        4

1 2 3 4

2

0

样例输出

        2 3

样例说明

该完全二叉树的第一层是1,第二层是2 3,第三层是4;题目要求输出第二层,则输出2 3。

 

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5     int n;
 6     int i,k;
 7     int depth=1;
 8     int number;
 9     int tree[1003]={0};
10     int d;//targeted_depth
11 
12     while(1){
13         scanf("%d",&n);
14         if(n==0) break;
15 
16         while(1)
17         {
18             if((int)pow(2,depth)>n) break;
19             else depth++;
20 
21         }
22         //depth=[log2(n)]+1;
23         //printf("%d",depth);
24         //debugged    这个深度,当时大半夜debug弄得要死要活的,困困
25 
26 
27         for(k=1;k<=n;k++)
28         {
29             int number;
30             scanf("%d",&number);
31             tree[k]=number;
32         }
33 
34         scanf("%d",&d);
35         if(d>depth||d<1) 
36         {
37             printf("EMPTY\n");
38         }
39         else if(d<depth)
40         {
41             for(i=(int)pow(2,d-1);i<=(int)pow(2,d)-1;i++)//手算的结果
42             {
43                 printf("%d ",tree[i]);
44             }
45             printf("\n");
46         }
47         else if(d==depth)
48         {
49             for(i=(int)pow(2,d-1);i<=n;i++)
50             {
51                 printf("%d ",tree[i]);
52             }
53             printf("\n");
54         }
55     }
56     return 0;
57 
58 }
函数pow返回的是double需要强制转化为int
41行怎么来的:完全二叉树深度为d的一行,第一个结点序号为pow(2,d-1),最后一个为pow(2,d)-1

47行:多的这个else是考虑了最后一行不满的情况