编程题 03-树2 List Leaves【PAT】

news2025/7/15 15:40:39

文章目录

  • 题目
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例
  • 题解
    • 解题思路
    • 完整代码

编程练习题目集目录

题目

  Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.

输入格式

  Each input file contains one test case. For each case, the first line gives a positive integer N ( ≤ 10 ) N (≤10) N(10) which is the total number of nodes in the tree − − -- and hence the nodes are numbered from 0 0 0 to N − 1 N−1 N1. Then N N N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a " − " "-" "" will be put at the position. Any pair of children are separated by a space.

输出格式

  For each test case, print in one line all the leaves’ indices in the order of top down, and left to right. There must be exactly one space between any adjacent numbers, and no extra space at the end of the line.

输入样例

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

输出样例

4 1 5

题解

解题思路

在这里插入图片描述
  找到树的根结点,根据树的根结点以及其它一系列结点构建树,按照从上到下,从左到右的顺序(层次遍历)输出这棵树的叶子结点。

完整代码

#include <iostream>         // 包含标准输入输出流库
#include <queue>            // 包含队列数据结构库

using namespace std;        // 使用标准命名空间

#define MaxN  10            // 定义最大节点数量

// 定义二叉树节点结构
struct TreeNode
{
    int Data;           // 节点存储的数据
    int Left;           // 左子节点的索引,若无左子节点则为-2
    int Right;          // 右子节点的索引,若无右子节点则为-2
} TN[MaxN];             // TN[]为全局变量,存储所有节点信息,最多MaxN个节点

int buildTree(TreeNode T[], int n);         // 构建二叉树,并返回根节点索引
void Traversal(int root);                   // 层序遍历二叉树,并输出叶节点值

int main(void)
{
    int N, root;                            // N表示树的节点数量,root表示根节点索引
    cin >> N;
    root = buildTree(TN, N);                // 构建树并获取根节点索引
    Traversal(root);                        // 层序遍历并输出叶节点值
    return 0;
}

// 构建二叉树
int buildTree(TreeNode T[], int n)
{
    int i, check[MaxN];                  // 检查数组,用于标记是否为子节点
    char left, right;                    // 用于存储左右子节点的输入字符
    if (n == 0) {                        // 如果节点数量为0,返回-2表示空树
        return -2;
    }
    for (i = 0; i < n; i++) {           // 初始化所有节点,初始时假设所有节点都不是子节点
        check[i] = -1;                  // -1表示非子节点
        TN[i].Data = i;                 // 每个节点的编号即为自己的数据
    }
    for (i = 0; i < n; i++) {           // 根据输入构建树
        cin >> left >> right;           // 输入当前节点的左右子节点信息
        if (left != '-') {                  // 如果有左子节点
            T[i].Left = left - '0';         // 将字符转换为索引
            check[T[i].Left] = 1;           // 标记左子节点对应的索引为子节点
        }
        else {
            T[i].Left = -2;                 // 表示无左子节点
        }
        if (right != '-') {                 // 如果有右子节点
            T[i].Right = right - '0';       // 将字符转换为索引
            check[T[i].Right] = 1;          // 标记右子节点对应的索引为子节点
        }
        else {
            T[i].Right = -2;                // 表示无右子节点
        }
    }
    // 查找根节点(未被标记为子节点的节点)
    for (i = 0; i < n; i++) {
        if (check[i] == -1) break;          // 找到根节点
    }
    return i;                               // 返回根节点索引
}
// 层序遍历二叉树并输出叶节点值
void Traversal(int root)
{
    queue<struct TreeNode> Q;               // 定义一个队列用于层序遍历
    struct TreeNode T;                      // 临时存储队列中的节点

    if (root == -2) {                       // 如果根节点不存在,直接返回
        return;
    }
    Q.push(TN[root]);                       // 将根节点入队
    int flag = 0;                           // 标志变量,用于控制输出格式
    while (!Q.empty()) {                    // 当队列非空时
        T = Q.front();                      // 取出队列头部节点
        Q.pop();                            // 出队
        if (T.Left == -2 && T.Right == -2) {        // 如果当前节点是叶节点
            if (flag == 1) cout << " ";             // 如果不是第一个叶节点,输出空格
            else flag = 1;                          // 标记已经输出过叶节点
            printf("%d", T.Data);             // 输出叶节点的值
        }
        if (T.Left != -2) {
            Q.push(TN[T.Left]);                     // 如果有左子节点,将左子节点入队
        }
        if (T.Right != -2) {                        // 如果有右子节点,将右子节点入队
            Q.push(TN[T.Right]);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

生信小白学Rust-03

语句和表达式 举个栗子&#x1f330; fn add_with_extra(x: i32, y: i32) -> i32 {let x x 1; // 语句let y y 5; // 语句x y // 表达式 } // 语句执行操作 // 表达式会返回一个值 怎么区分呢&#xff0c;目前我的理解是只要返回了值&#xff0c;那它就是表达式 fn…

缺乏需求优先级划分时,如何合理分配资源?

当需求优先级不明确时&#xff0c;合理分配资源的关键在于建立统一评估标准、实施敏捷资源管理、提升团队协作效率、加强跨部门沟通机制。尤其是建立统一评估标准至关重要&#xff0c;它能帮助组织快速判断各项需求的重要性与紧迫性&#xff0c;从而实现资源的动态匹配与有效利…

操作系统学习笔记第3章 内存管理(灰灰题库)

1. 单选题 某页式存储管理系统中&#xff0c;主存为 128KB&#xff0c;分成 32 块&#xff0c;块号为 0、1、2、3、…、31。某作业有 5 块&#xff0c;其页号为 0、1、2、3、4&#xff0c;被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70]&#xff08;其中方括号中…

详细分析python 中的deque 以及和list 的用法区别

dqque :双端队列&#xff0c;可以快速的从另外一侧追加和推出对象,deque是一个双向链表&#xff0c;针对list连续的数据结构插入和删除进行优化。它提供了两端都可以操作的序列&#xff0c;这表示在序列的前后你都可以执行添加或删除操作。 通过上图可以看出&#xff0c;deque …

Stack overflow

本文来源 &#xff1a;腾讯元宝 Stack Overflow - Where Developers Learn, Share, & Build Careers 开发者学习&#xff0c;分享 通过学习、工作和经验积累等方式&#xff0c;逐步建立和发展自己的职业生涯。 Find answers to your technical questions and help othe…

和为target问题汇总

文章目录 习题377.组合总和 IV494.目标和 和为target的问题&#xff0c;可以有很多种问题的形式的考察&#xff0c;当然&#xff0c;及时的总结与回顾有利于我们熟练掌握这些知识&#xff01; 习题 377.组合总和 IV 377.组合总和 IV 思路分析&#xff1a;通过观察&#xff0…

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…

Ubuntu 编译SRS和ZLMediaKit用于视频推拉流

SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡&#xff0c;修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp&#xff0c;在 232 行后面添加&#xff1a; ZLMediaKit编译后文件存放在ZLMediakit/rele…

Intellij报错:the file size(3.47M) exceeds configured limit (2.56MB)

今天在部署一个教学平台的时候&#xff0c;当执行数据库脚本出现了以上问题。 自己把解决的方案分享给大家&#xff1a; 于IntelliJ IDEA或PyCharm&#xff0c;可以通过编辑idea.properties文件来增加文件大小限制。 打开idea.properties文件&#xff0c;通常位于IDE的安装目录…

Unity动画与生命周期函数

一、Animator动画组件 Animator组件是Unity中用于管理和控制动画的主要工具&#xff0c;它可以处理复杂的动画状态机和动画片段之间的过 1.动画状态机 Animator组件的核心是动画状态机&#xff0c;它由多个动画状态和状态之间的过渡组成。可以通过Unity的动画窗口来创建和编辑…

解决ubuntu20中tracker占用过多cpu,引起的风扇狂转

track是linux中的文件索引工具&#xff0c;ubuntu18之前是默认不安装的&#xff0c;所以在升级到20后会默认安装&#xff0c;它是和桌面程序gnome绑定的&#xff0c;甚至还有很多依赖项&#xff0c;导致无法删除&#xff0c;一旦删除很多依赖项都不能运行&#xff0c;禁用也很难…

在线文档管理系统 spring boot➕vue|源码+数据库+部署教程

&#x1f4cc; 一、项目简介 本系统采用Spring Boot Vue ElementUI技术栈&#xff0c;支持管理员和员工两类角色&#xff0c;涵盖文档上传、分类管理、公告发布、员工资料维护、部门岗位管理等核心功能。 系统目标是打造一个简洁高效的内部文档管理平台&#xff0c;便于员工…

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中&#xff0c;交互规则主要有三个核心要素&#xff0c;分别为重要性、原则与实践&#xff0c;具体表现在&#xff1a; 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑&#xff1a;设计阶段制定交互规则&#xff0c;清晰定义界面元素操作响应。 如社交应用…

OpenResty Manager 介绍与部署(Docker部署)

概述 OpenResty-Manager 是一个基于 OpenResty 构建的开源 Web 管理平台。OpenResty 是一个高性能的 Web 平台&#xff0c;集成了 Nginx 和 LuaJIT&#xff0c;支持强大的脚本功能。OpenResty-Manager 由 Safe3 开发&#xff0c;提供了一个用户友好的界面&#xff0c;用于管理…

快速搭建一个electron-vite项目

1. 初始化项目 在命令行中运行以下命令 npm create quick-start/electronlatest也可以通过附加命令行选项直接指定项目名称和你想要使用的模版。例如&#xff0c;要构建一个 Electron Vue 项目&#xff0c;运行: # npm 7&#xff0c;需要添加额外的 --&#xff1a; npm cre…

unity terrain 在生成草,树,石头等地形障碍的时候,无法触发碰撞导致人物穿过模型

1.terrain地形的草&#xff0c;石头之类要选择模型预制体 2.在人物身上挂碰撞器和刚体&#xff0c;或者单挂一个character controller组件也行 3.在预制体上挂碰撞盒就好了&#xff0c;挂载meshcollider会导致碰撞无效

75.xilinx复数乘法器IP核调试

&#xff08;83*j&#xff09;*(57j) 935j 正确的是 1971j 分析出现的原因&#xff1a;&#xff08;abj&#xff09;* (cdj) (ac-bd)j(adbc) 其中a,b,c,d都是16bit的有符号数&#xff0c;乘积的结果为保证不溢出需要32bit存储&#xff0c;最终的复数乘法结果是两个32b…

8.ADC

目录 ADC 模拟信号和数字信号的区别和区别 信号的区别 如何采集信号 常见的接口 数字接口 模拟接口 ADC 实际应用 ADC 转换器的定义 ADC 相关的名词 ADC 采集的原理 ADC 的参考电压 相关的计算 如何实现 ADC STM32 内的 ADC 转换器讲解 STM32 的 ADC 简介 AD…

c/c++中程序内存区域的划分

c/c程序内存分配的几个区域&#xff1a; 1.栈区&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结束时这些存储单元自动被释放&#xff0c;栈内存分配运算内置于处理器的指令集中&#xff0c;效率很高但是分配的内存容量有…

模糊综合评价模型建立

模糊综合评价模型建立 一、整体流程 二、代码实现(含大量注释) #程序文件ex14_4.py import numpy as npa np.loadtxt(data14_4.txt) # 使用定义匿名函数的形式来定义各个评价指标的隶属函数 f1 lambda x: x/8800 f2 lambda x: 1-x/8000 f3 lambda x: (x<5.5)(8-x)/(8-…