<数据结构>XDOJ317.输出完全二叉树的某一层
2024-09-04 20:20:52
问题与解答
问题描述
对一棵完全二叉树,输出某一深度的所有节点,有则输出这些节点,无则输出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");
}
}
}
最新文章
- Visual Studio跨平台开发Xamarin
- .Net MVC+bootstrap Table学习
- 金融左侧js错误
- iOS开发之静态库(六)—— 时空之争
- RDoc
- 崩溃信息:Message from debugger: Terminated due to signal 9
- js模板引擎实现原理
- 开机时候系统总是提醒Android系统更新
- hdu 5570 balls(期望好题)
- docker学习笔记(1)
- 转 C#中静态方法与非静态方法区别比较
- QTP DataTable全攻略(1)
- Activity not started, its current task has been brought to the front的解决办法
- php中的实用分页类
- Polya计数
- 高通开发笔记---Yangtze worknote
- Chapter 1 Securing Your Server and Network(12):保护链接服务器
- linux系统做raid
- Chapter 4 Invitations——25
- python通配符之glob模块
热门文章
- linux 常用清空文件方法
- DBMS_RANDOM包详解
- java中的原子操作类AtomicInteger及其实现原理
- this指针的用法和基本分析
- 【VSCode】检测到 #include 错误。请更新 includePath。已为此翻译单元(C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\i686-
- mysql安装 报错解决
- Mysql实例 表设计
- shell脚本 系统状态信息查看
- 可恶的Math.random()
- IOS 真机调试和发布相关证书