基础实验4-2.2 列出叶结点

news2024/10/17 21:21:35

基础实验4-2.2 列出叶结点

分数 25

全屏浏览

切换布局

作者 陈越

单位 浙江大学

对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶结点。

输入格式:

首先第一行给出一个正整数 n(≤10),为树中结点总数。树中的结点从 0 到 n−1 编号。随后 n 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。

输出格式:

在一行中按规定顺序输出叶结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

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

输出样例:

4 1 5

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

#include<bits/stdc++.h>
using namespace std;

int main(){
   int n;
    cin >> n;
    
    vector<pair<string, string>> tree(n);
    vector<bool> isChild(n, false);
    
    for (int i = 0; i < n; i ++){
        cin >> tree[i].first >> tree[i].second;

        //找出根节点
        if (tree[i].first != "-") isChild[stoi(tree[i].first)] = true;
        
        if (tree[i].second != "-") isChild[stoi(tree[i].second)] = true;
    }

    int root = -1;

    for (int i = 0; i < n; i ++){
        if (!isChild[i]){
            root = i;
            break;
        }
    }
    
    vector<int> leafNodes;
    queue<int> q;
    q.push(root);
    
    //层序遍历
    while(!q.empty()){
        int index = q.front();
       
        q.pop();
        if (tree[index].first == "-" && tree[index].second == "-"){
            leafNodes.push_back(index);
        }

        //stoi 将字符串转换为整数
        if (tree[index].first != "-") q.push(stoi(tree[index].first));
        
        if (tree[index].second != "-") q.push(stoi(tree[index].second));
    }
    

    for (int i = 0; i < leafNodes.size(); i ++){ // 修改这里  
        if (i == 0) cout << leafNodes[i];  
        else cout << " " << leafNodes[i];  
    } 
    return 0;
}

代码思路:

  1. 输入处理与树的构建:

    cpp
    
    vector<pair<string, string>> tree(n); 
    vector<bool> isChild(n, false);
    • 定义了一个 tree 数组,用来存储每个节点的左右孩子。每个元素是一个 pair<string, string> 类型的对,存放左右孩子的编号,使用 "-" 表示没有孩子。
    • 定义了一个 isChild 数组,用来标记哪些节点是其他节点的孩子。
  2. 标记子节点和找到根节点:
     

    for (int i = 0; i < n; i ++){
        cin >> tree[i].first >> tree[i].second;
    
        if (tree[i].first != "-") isChild[stoi(tree[i].first)] = true;
        if (tree[i].second != "-") isChild[stoi(tree[i].second)] = true;
    }
    
    • 遍历所有节点的输入,读取左右孩子,并标记这些孩子节点。
    • 如果某个节点的左孩子或右孩子存在(不是 "-"),我们将 isChild 数组对应孩子的索引标记为 true。这意味着这个节点是其他节点的子节点。
    • 随后遍历 isChild 数组,找到根节点,它是唯一一个没有被标记为子节点的节点。
  3. 层序遍历查找叶节点:
     

    vector<int> leafNodes;
    queue<int> q;
    q.push(root);
    
    while(!q.empty()){
        int index = q.front();
        q.pop();
        if (tree[index].first == "-" && tree[index].second == "-"){
            leafNodes.push_back(index);
        }
        if (tree[index].first != "-") q.push(stoi(tree[index].first));
        if (tree[index].second != "-") q.push(stoi(tree[index].second));
    }
    
    • 采用层序遍历(广度优先遍历),即从根节点开始,按照从上到下、从左到右的顺序遍历整棵树。遍历过程中我们使用一个队列 queue<int> 来保存当前需要处理的节点。
    • 如果某个节点的左右孩子都是 "-",说明它是叶子节点,将其编号加入到 leafNodes 数组中。
    • 若左右孩子存在,则将孩子的编号转换为整数并加入队列。
  4. 输出结果:

    for (int i = 0; i < leafNodes.size(); i ++){
        if (i == 0) cout << leafNodes[i];  
        else cout << " " << leafNodes[i];  
    }
    
    • 最后遍历 leafNodes 数组,按要求输出所有叶子节点的编号。注意第一个输出元素前不加空格,之后的元素前加上空格。

关键知识点解释:

  1. pair<string, string>:

    • pair 是 C++ 标准库中的一种数据结构,可以存储两个值。这里的 pair<string, string> 用来存储每个节点的左右孩子,使用字符串类型来处理输入的 "-"
  2. stoi()

    • stoi() 是 C++ 的标准函数,用来将字符串转换为整数。比如,stoi("1") 将字符串 "1" 转换为整数 1。在这道题中,用于将左右孩子的字符串编号转换成整数,方便后续操作。
  3. queue<int> 和层序遍历:

    • 层序遍历(广度优先搜索,BFS)是一种遍历树的方式,按照从上到下、从左到右的顺序访问节点。实现层序遍历通常使用队列(queue),每次从队列中取出当前节点,然后将它的孩子加入队列。这样保证访问顺序符合题目的要求。
  4. isChild 数组:

    • 这个数组用来标记哪些节点是其他节点的孩子。如果某个节点的左或右孩子存在,就将对应编号的 isChild 设为 true。最终通过检查哪些节点没有被标记为子节点,找出树的根节点。
  5. 叶节点的判断:

    • 叶节点是没有任何子节点的节点。通过检查节点的左右孩子是否都为 "-",可以判断它是否是叶节点。

总结:

  • 整个程序的核心是二叉树的层序遍历,配合 queue 来逐层查找叶节点。通过 isChild 数组标记子节点,并找到根节点,再依次将叶节点输出,解决了这道题。

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

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

相关文章

MySQL-12.DQL-条件查询

一.DQL-条件查询 -- DQL:条件查询 -- 1.查询 姓名 为 杨逍 的员工 select id, username, password, name, gender, image, job, entrydate, create_time, update_timefrom tb_emp where name 杨逍;-- 2.查询 id小于等于5 的员工信息 select * from tb_emp where id < 5;-…

HT3382 2x75W D类立体声音频功放

1、特点 输出功率(BTL) 2x60W (VDD24V,RL4Ω,THDN1%) 2x75W(VDD24V,RL4Ω,THDN10%) 输出功率(PBTL) 115W(VDD24V,RL2Ω,THDN1%) 140W(VDD24V,RL2Ω,THDN10%) 单电源系统&#xff0c;4.5V-26V宽电压输入范围 超过93%效率&#xff0c;需散热器 扩频功能 MUTE功能 模拟差分/单端输…

LLM - 使用 Neo4j 可视化 GraphRAG 构建的 知识图谱(KG) 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142938982 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Neo4j …

中科大科大讯飞开源OpenMusic:音乐生成更高质量,更有乐感

文章链接&#xff1a;https://arxiv.org/pdf/2405.15863 代码链接&#xff1a;https://github.com/ivcylc/qa-mdt Huggingface链接&#xff1a;https://huggingface.co/spaces/jadechoghari/OpenMusic Demo链接&#xff1a;https://qa-mdt.github.io/ &#xff08;chatgpt * 3…

苹果 AI 及国产大模型之争:悬念不再?

AI基本盘&#xff0c;牢牢把握在苹果手里 苹果终于公布了最新的AI进程。 一个月前&#xff0c;正如此前预期的那样&#xff0c;人工智能是今年 WWDC 发布会的焦点。全程105分钟的主题演讲&#xff0c;就有40多分钟用于介绍苹果的AI成果。 苹果似乎还有意玩了一把“谐音梗”&…

人脸识别-特征算法

文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术&#xff0c;其核心在于通过特定的算法和技术手段&#xf…

跟李沐学AI—pytorch版本锚框代码解析

网上大佬的解释 https://fkjkkll.github.io/2021/11/23/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8BSSD/?highlight%E9%94%9A%E6%A1%86 w torch.cat((size_tensor * torch.sqrt(ratio_tensor[0]),sizes[0] * torch.sqrt(ratio_tensor[1:])))\* in_height / in_widthh torch.cat((…

当贝投影双十一战报揭晓:天猫投影品类销量稳居首位

相比往年&#xff0c;2024年双11提前了10天&#xff0c;于10月14日正式拉开帷幕。其中&#xff0c;作为国内智能投影头部品牌之一的当贝投影&#xff0c;首战告捷&#xff0c;迎来开门红&#xff0c;战绩相当喜人&#xff01; 根据当贝投影官方数据显示&#xff0c;10月至今当贝…

基于SpringBoot的在线视频教育平台的设计与实现(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线视频教育平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线视频教育平台&#xff0c;它彻底改变了过…

vue 2.0 使用 html2canvas + jspdf +ant-design-vue 1.x + echarts + 高德地图 导出数据报告

思路&#xff1a; 1. 因为html转为图片再加入到PDF中 会导致截断&#xff0c;因此前端自定义分页添加 类 &#xff08;page&#xff09; 2. 通过page生成图片 在加入PDF中<template><div id"pdf-content"><div class"page first-page">&…

Jmeter接口测试企业级项目实战day2

1.JMeter接口关联 含义&#xff1a;把上一个接口的响应内容&#xff0c;作为下一个接口的请求参数 思路&#xff1a;通过变量来传递数据 步骤&#xff1a; 1.创建&#xff1a;上一个接口&#xff0c;添加【后置处理器】&#xff1a;提取数据创建变量 2.使用&am…

项目分析:自然语言处理(语言情感分析)

在这个信息爆炸的时代&#xff0c;我们每天都在与海量的文本数据打交道。从社交媒体上的帖子、在线评论到新闻报道&#xff0c;文本信息无处不在。然而&#xff0c;这些文本不仅仅是文字的堆砌&#xff0c;它们背后蕴含着丰富的情感和观点。如何有效地理解和分析这些情感&#…

leetcode48:旋转矩阵

题目&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5…

昆仑虚 - NextJS 项目如何进行部署?

引言 NextJS 是一个构建于 NodeJS 之上的一个 Web 开发框架。它基于 React 特性进行了一些列的扩展!! 在社区中也很是火热, 前段时间 「昆仑虚」 也终于完成了项目的迁移(React > NexJS)!! 那么接下来就是项目部署, NextJS 相比常规的前端部署还是有所区别的: 常规的前端…

便捷实用的桌面时钟 让你随时掌握时间 美观且大气

便捷实用的桌面时钟 让你随时掌握时间 美观且大气。桌面时钟顾名思义就是可以放在桌面上的时钟&#xff0c;这是一款界面优美,功能实用,易于操作的桌面时钟工具芝麻时钟&#xff08;下载地址&#xff1a;https://clock.zhimasoft.cn/?bi&#xff09; 找个好看的桌面时钟&…

【R语言】随机森林+相关性热图组合图

数据概况文末有获取方式 随机森林部分 #调用R包 library(randomForest) library(rfPermute) library(ggplot2) library(psych) library(reshape2) library(patchwork) library(reshape2) library(RColorBrewer) ​ ​ #读取数据 df<-read.csv("F:\\EXCEL-元数据\\2020…

Spring Boot与JavaWeb协同:在线考试系统的实现“

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现…

【02】Windows特殊权限-Trustedinstaller

知识点&#xff1a; “TrustedInstaller” 是 Windows 操作系统中的一个特殊账户&#xff0c;用于管理和保护重要的系统文件。它是 Windows 模块安装程序 (Windows Modules Installer) 的一部分&#xff0c;负责安装、修改和删除 Windows 更新和可选组件。默认情况下&#xff…

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代&#xff0c;如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具&#xff0c;凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性&#xff0c;成为了众多企业和个人的首选。本文将…

C++/初识C++

目录 一、前言 二、正文 1C语言第一个程序&#xff1a; 1.1C的第一个程序&#xff1a; 2.命名空间 2.1 namespace的价值 2.2namespace的定义 2.3namespace的正常使用 3.C输出和输入 三、结言 一、前言 点来不及悼念C语言&#xff0c;接下来出场的是新的语言C。不同于C…