《算法笔记》9.3小节——数据结构专题(2)->树的遍历 问题 A: 树查找

题目描述

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

输入

输入有多组数据。

每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。

输出

输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。

样例输入
复制代码
5
1 2 3 4 5 
7
7
1 2 3 4 5 6 7 
2
0
样例输出
复制代码
EMPTY
2 3

分析: 由于是完全二叉树,可以用数组存储。直接找到某一层对应的编号输出即可。或者按层次分别存储。

cpp 复制代码
#include    <algorithm>
#include     <iostream>
#include      <cstdlib>
#include      <cstring>
#include       <string>
#include       <vector>
#include       <cstdio>
#include        <queue>
#include        <stack>
#include        <ctime>
#include        <cmath>
#include          <map>
#include          <set>
#include<unordered_map>
#define INF 0x3f3f3f3f
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,a) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#a<<"="<<(a)<<endl
#define db5(x,y,z,a,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#a<<"="<<(a)<<", "<<#r<<"="<<(r)<<endl
using namespace std;

int main(void)
{
    #ifdef test
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    clock_t start=clock();
    #endif //test

    int n;
    while(scanf("%d",&n),n)
    {
        int num[11][1026];memset(num,0,sizeof(num));
        int len[15]={0,1,2,4,8,16,32,64,128,256,512,1024};
        int index=1;
        for(int i=0;i<n;++i)
        {
            int a;scanf("%d",&a);
            if(num[index][0]<len[index])
            {
                num[index][num[index][0]+1]=a,num[index][0]++;
            }
            else
            {
                index++;
                num[index][num[index][0]+1]=a,num[index][0]++;
            }
        }
        int d;scanf("%d",&d);
        if(num[d][0]==0)printf("EMPTY\n");
        else
        {
            for(int j=1;j<=num[d][0];++j)
            {
                if(j==1)printf("%d",num[d][j]);
                else printf(" %d",num[d][j]);
            }printf("\n");
        }
    }

    #ifdef test
    clockid_t end=clock();
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    printf("\n\n\n\n\n");
    cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位
    cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位
    #endif //test
    return 0;
}
相关推荐
THMAIL20 分钟前
深度学习从入门到精通 - LSTM与GRU深度剖析:破解长序列记忆遗忘困境
人工智能·python·深度学习·算法·机器学习·逻辑回归·lstm
JuneXcy24 分钟前
结构体简介
c语言·数据结构·算法
jiaway30 分钟前
【C语言】第四课 指针与内存管理
c语言·开发语言·算法
菩提树下的凡夫34 分钟前
瑞芯微RV1126目标识别算法Yolov8的部署应用
java·算法·yolo
多打代码1 小时前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
j_xxx404_3 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺3 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
THMAIL3 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
野犬寒鸦3 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香3 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展