问题与解答

问题描述

对一棵完全二叉树,输出某一深度的所有节点,有则输出这些节点,无则输出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。

关键:由深度确定完全二叉树数组的下标

#include<stdio.h>
#include<math.h>
#define MaxNum 1010
int main()
{
int m,i,j,deep,deepest;
while(scanf("%d",&m)!=EOF && m) //多点测试输入
{
int T[MaxNum];
for(i=1; i<=m; i++)
scanf("%d",&T[i]);
scanf("%d",&deep);
deepest = (int)(log(m)/log(2))+1; //完全二叉树的深度:根节点为深度1
if(deep > deepest)
/*给定深度大于树的最大深度: 输出结点为空*/
printf("EMPTY\n");
else
if(deep == deepest)
{
/*给定深度等于树的最大深度: 输出最后一层结点*/
i = (int)pow(2,deep-1); //最后一层首元素的下标
for(i=i; i<=m; i++) //最后一层不一定满
printf("%d ",T[i]);
printf("\n"); //注意换行
}
else
{
/*给定深度小于树的最大深度: 输出中间某层结点*/
i = (int)pow(2, deep-1); //第deep层的首元素下标为i
j = (int)pow(2, deep)-1; //第deep层的末元素下标为j(对于完全二叉树来说中间层必定是满的)
for(i=i; i<=j; i++)
printf("%d ",T[i]);
printf("\n");
} }
}

最新文章

  1. Visual Studio跨平台开发Xamarin
  2. .Net MVC+bootstrap Table学习
  3. 金融左侧js错误
  4. iOS开发之静态库(六)—— 时空之争
  5. RDoc
  6. 崩溃信息:Message from debugger: Terminated due to signal 9
  7. js模板引擎实现原理
  8. 开机时候系统总是提醒Android系统更新
  9. hdu 5570 balls(期望好题)
  10. docker学习笔记(1)
  11. 转 C#中静态方法与非静态方法区别比较
  12. QTP DataTable全攻略(1)
  13. Activity not started, its current task has been brought to the front的解决办法
  14. php中的实用分页类
  15. Polya计数
  16. 高通开发笔记---Yangtze worknote
  17. Chapter 1 Securing Your Server and Network(12):保护链接服务器
  18. linux系统做raid
  19. Chapter 4 Invitations——25
  20. python通配符之glob模块

热门文章

  1. linux 常用清空文件方法
  2. DBMS_RANDOM包详解
  3. java中的原子操作类AtomicInteger及其实现原理
  4. this指针的用法和基本分析
  5. 【VSCode】检测到 #include 错误。请更新 includePath。已为此翻译单元(C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\i686-
  6. mysql安装 报错解决
  7. Mysql实例 表设计
  8. shell脚本 系统状态信息查看
  9. 可恶的Math.random()
  10. IOS 真机调试和发布相关证书