<数据结构>XDOJ317.输出完全二叉树的某一层

问题与解答

问题描述
对一棵完全二叉树,输出某一深度的所有节点,有则输出这些节点,无则输出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");
        }

    }
}
posted @   咪啪魔女  阅读(436)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示