树状结构查询 - 华为OD统一考试

news2024/12/22 23:16:07

OD统一考试

分值: 200分

题解: Java / Python / C++

alt

题目描述

通常使用多行的节点、父节点表示一棵树,比如:

西安 陕西

陕西 中国

江西 中国

中国 亚洲

泰国 亚洲

输入一个节点之后,请打印出来树中他的所有下层节点。

输入描述

第一行输入行数,下面是多行数据,每行以空格区分节点和父节点

接着是查询节点

输出描述

输出查询节点的所有下层节点。以字典序排序。

备注: 树中的节点是唯一的,不会出现两个节点,是同一个名字

示例1

输入:
5
b a
c a
d c
e c
f d
c

输出:
d
e
f

题解

这道题是一个树的遍历问题,首先构建树的结构,然后深度优先遍历 (DFS) 树的某一节点,收集其所有下层节点并按字典序排序输出。

Java、Python、C++ 代码中,都定义了一个 Node 类表示树的节点,包含节点名称和子节点列表。然后通过输入的边信息构建了这个树的结构,最后进行 DFS 遍历。

下面是一些关键点的总结:

  1. 树的表示: 使用 Node 类表示树的节点,通过 addChild 方法构建父子关系,通过 dfs 方法进行深度优先遍历。
  2. DFS 遍历: 递归地遍历树的节点,将每个子节点的名称收集起来,最后按字典序排序。
  3. 输入处理: 使用 Scanner(Java)、input()(Python)、cin(C++)等方式读取输入。
  4. 数据结构选择: 在 Java 和 Python 中,使用了 ArrayList 和列表(list)作为存储子节点的数据结构;在 C++ 中,使用了 vector
  5. 节点查找: 通过构建的树结构,可以通过输入的关键节点找到相应的节点,然后进行 DFS 遍历。

总体而言,这个问题是一个典型的树的深度优先遍历问题,通过递归的方式遍历树的节点,按字典序排序输出结果。

Java

import java.util.*;
/**
 * @author code5bug
 */
class Node {
    String name;
    List<Node> children;

    public Node(String name) {
        this.name = name;
        this.children = new ArrayList<>();
    }

    void addChild(Node child) {
        children.add(child);
    }
}

public class Main {
    public static void dfs(Node node, List<String> collect) {
        for (Node child : node.children) {
            collect.add(child.name);
            dfs(child, collect);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<String, Node> nodeMap = new HashMap<>();

        // 构建父子关系
        int n = Integer.parseInt(scanner.nextLine());
        for (int i = 0; i < n; ++i) {
            String[] input = scanner.nextLine().split(" ");
            String child = input[0];
            String parent = input[1];

            nodeMap.computeIfAbsent(child, Node::new);
            nodeMap.computeIfAbsent(parent, Node::new);
            nodeMap.get(parent).addChild(nodeMap.get(child));
        }

        List<String> result = new ArrayList<>();
        String keyword = scanner.nextLine();
        dfs(nodeMap.get(keyword), result);

        result.stream()
                .sorted(Comparator.naturalOrder())
                .forEach(System.out::println);

    }
}

Python

class Node:
    def __init__(self, name):
        self.name = name
        self.children = []

    def addChild(self, child):
        self.children.append(child)


# 缓存所有的节点
node_map = {}
# 构建父子关系
for _ in range(int(input())):
    child, parent = input().split()
    node_map.setdefault(child, Node(child))
    node_map.setdefault(parent, Node(parent))
    node_map[parent].addChild(node_map[child])


def dfs(node, collect):
    """收集所有的子节点的名称到 collect 中"""
    for child in node.children:
        collect.append(child.name)
        dfs(child, collect)


result = []
dfs(node_map[input()], result)
result.sort()
print(*result, sep="\n")

C++

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>

using namespace std;

class Node {
public:
    string name;
    vector<Node> children;

    Node(){}

    Node(string name) : name(name) {}

    void addChild(const Node& child) {
        children.push_back(child);
    }
};

void dfs(const Node& node, vector<string>& collect) {
    for (const Node& child : node.children) {
        collect.push_back(child.name);
        dfs(child, collect);
    }
}

int main() {
    unordered_map<string, Node> node_map;

    int n;
    cin >> n;

    // 构建父子关系
    for (int i = 0; i < n; ++i) {
        string child, parent;
        cin >> child >> parent;

        node_map.emplace(child, Node(child));
        node_map.emplace(parent, Node(parent));

        node_map[parent].addChild(node_map[child]);
    }

    string keyword;
    cin >> keyword;

    vector<string> result;
    dfs(node_map[keyword], result);
    sort(result.begin(), result.end());

    for (const string& name : result) {
        cout << name << endl;
    }

    return 0;
}

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

Python: Spire.PDF-for-Python

# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 3.11 # Datetime : 2024/1/11 10:32 # User : geovindu # Product : PyChar…

TypeScript类型挑战:实现内置的Omit实用类型

掌握 TypeScript Omit 泛型&#xff0c;一起完成 Type 挑战&#xff0c;巩固 TypeScript 知识。 为了帮助读者更好地巩固 TypeScript 的知识&#xff0c;我从 Github 上的 type-challenges 库中选择了几十个挑战&#xff0c;与您一起完成类型挑战。 挑战 实现内置的 Omit&…

分布式系统架构设计之分布式消息队列的水平扩展性、安全可用性以及监控与调优

一、分布式消息队列的水平扩展 随着业务的快速发展和数据的不断增长&#xff0c;单一的消息队列服务器往往难以满足高并发、高可用和高吞吐量的需求&#xff0c;因此&#xff0c;如何实现消息队列的水平扩展成为了一个重要的问题。这部分我将从分区、副本、负载均衡等关键概念…

影响eCPM的因素有哪些?如何提升eCPM?

eCPM&#xff08;千次展示有效收益&#xff09;直接关系广告变现收益的高低&#xff0c;是开发者们最关心的数据之一。要想优化提升eCPM&#xff0c;首先要了解哪些主要因素影响eCPM&#xff0c;再针对性优化广告库存&#xff0c;提高变现收益。 https://www.shenshiads.com …

线性回归实例

1、线性回归&#xff08;linear Regression&#xff09;和逻辑回归&#xff08;logistic Regression&#xff09;的区别 线性回归主要是用来拟合数据&#xff0c;逻辑回归主要是用来区分数据&#xff0c;找到决策边界。 线性回归的代价函数常用平方误差函数&#xff0c;逻辑回…

java每日一题——打印100以内个位和十位相同,尾数为1,3,5,7的数字

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;打印100以内个位和十位相同&#xff0c;尾数为1,3,5,7的数字 思路&#xff1a;1&#xff0c;个位通过对10求余数可求出1&#xff0c;3&#xff0c;5&#xff0c;7&#xff1b; 2&#xff0c;十位可通过先除10…

【Unity】【Pico】【VR开发】为何PICO打包后真机运行闪退

【背景】 设置步骤&#xff0c;项目配置都没问题&#xff0c;Build也成功&#xff0c;Unity版本是符合要求的2022LTS版本&#xff0c;但是一在真机上运行就闪退。 【分析】 由于并没有开版权验证&#xff0c;而且闪退后也并没有弹框说版权问题&#xff0c;所以还是怀疑环境有…

软件测试|Python成员运算符:使用方法与元素检查

简介 Python是一种功能强大的编程语言&#xff0c;提供了许多方便的工具来处理数据和集合。其中之一就是成员运算符&#xff0c;它允许我们在集合中检查特定元素的存在。在本文中&#xff0c;我们将深入探讨Python中的成员运算符&#xff0c;以及如何使用它来进行元素检查。 …

pyside6 捕捉主窗口关闭后,进行释放相关的资源

import sys from PySide6 import QtGui from PySide6.QtWidgets import QWidget,QApplication,QMessageBoxclass Message(QWidget):def __init__(self):# 如果希望窗口内嵌于其他部件&#xff0c;可添加parent参数super(Message, self).__init__()# 调用初始化方法self.initUI(…

使用Sqoop将数据导入Hadoop的详细教程

在大数据处理中&#xff0c;Sqoop是一个强大的工具&#xff0c;它可以将关系型数据库中的数据导入到Hadoop生态系统中&#xff0c;以便进行进一步的分析和处理。本文将提供一个详细的教程&#xff0c;以帮助大家了解如何使用Sqoop将数据导入Hadoop。 准备工作 在开始之前&…

【uniapp】新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

一、uniapp和HBuilderX介绍 uni-app官方网站&#xff1a;https://uniapp.dcloud.net.cn/ 为什么要学习uniapp&#xff1f; 1、一套代码可以打包到不同的应用平台&#xff1b;一套代码编到十几个平台&#xff0c;这不是梦想。眼见为实&#xff0c;扫描以下二维码&#xff0c;…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户投票实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

爬虫利器一览

前言 爬虫&#xff08;英文&#xff1a;spider&#xff09;&#xff0c;可以理解为简单的机器人&#xff0c;如此一个“不为名利而活&#xff0c;只为数据而生&#xff0c;目标单纯&#xff0c;能量充沛&#xff0c;不怕日晒雨淋&#xff0c;不惧寒冬酷暑”的家伙&#xff0c;…

[嵌入式软件][入门篇] 搭建在线仿真平台(STM32)

文章目录 一、注册平台二、创建首个项目三、硬件介绍 一、注册平台 进入官方&#xff0c;进行注册&#xff1a; 在线仿真地址 二、创建首个项目 ① 新建项目 ② 搭建一个电路 ③ 用STM32F103搭建一个简单电路 ④ 进入编码界面 三、硬件介绍 红框是必看文档&#xff…

【RT-DETR有效改进】带你分析如何确定改进的基础模型,解决模型无法收敛精度很差的问题(ResNet官方一比一复现)

一、本文介绍 Hello&#xff0c;各位读者&#xff0c;距离第一天发RT-DETR的博客已经过去了接近两个月&#xff0c;这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用&#xff0c;旨在为大家解决为什么用v8的仓库训练的时候模型不收敛&#xff0c;精度差的离谱的问…

Maven 依赖管理项目构建工具 教程

Maven依赖管理项目构建工具 此文档为 尚硅谷 B站maven视频学习文档&#xff0c;由官方文档搬运而来&#xff0c;仅用来当作学习笔记用途&#xff0c;侵删。 另&#xff1a;原maven教程短而精&#xff0c;值得推荐&#xff0c;下附教程链接。 atguigu 23年Maven教程 目录 文章目…

Skywalking UI页面中操作的各种实用功能汇总

刚刚接触skywalking不久&#xff0c;在这里总结一下在UI页面中操作的各种实用功能&#xff0c;随着使用的不断深入&#xff0c;我也会对文章进行持续补充。 本文skywalking 的ui入口是官方demo &#xff0c;版本是10.0.0-SNAPSHOT-593bd05 http://demo.skywalking.apache.org…

【GO语言依赖】Go语言依赖管理简述

在运行环境中&#xff0c;遭遇报错&#xff0c;显示找不到函数 经过研究后发现需要进行依赖管理&#xff0c;进行如下操作后解决&#xff1a; 起源 最早的时候&#xff0c;Go所依赖的所有的第三方库都放在GOPATH这个目录下面。这就导致了同一个库只能保存一个版本的代码。如…

vite 搭建vue3 TS项目初始框架

目录 仓库地址&#xff1a; 一.搭建项目 1.安装 Vite&#xff1a; 2.创建 Vue 3 项目&#xff1a; 3.进入项目目录&#xff1a; 4.安装依赖&#xff1a; 5.运行项目&#xff1a; 6.流程实操 二.修改项目结构&#xff0c;显示自定义的页面 1.整理静态样式文件 1.1.在 sr…

安泰电子功率放大器在设计电路时应该注意什么

在设计功率放大器电路时&#xff0c;有几个重要的因素需要特别注意。这些因素包括功率放大器的线性度、效率、稳定性、保护功能和适当的散热设计。下面将详细介绍每个因素&#xff0c;并说明在设计功率放大器电路时应该注意的要点。 线性度&#xff1a; 功率放大器的线性度是指…