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

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 = nameself.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.hqwc.cn/news/339272.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除sys_file表中的文件信息后同步操作表单中对应的文件字段信息

需求&#xff1a;由于系统的表单文件上传/删除操作与表单的保存操作不同时进行&#xff0c;所以需要调整 细节&#xff1a;&#xff08;某个表&#xff1a;A表&#xff09;表单的文件字段只是保存了上传文件的id&#xff0c;名称&#xff0c;真正的文件保存是保存在一个系统的文…

Retrieval-Augmented Generation for Large Language Models: A Survey

PS: 梳理该 Survey 的整体框架&#xff0c;后续补充相关参考文献的解析整理。本文的会从两个角度来分析总结&#xff0c;因此对于同一种技术可能在不同章节下都会有提及。第一个角度是从整体框架的迭代来看&#xff08;对应RAG框架章节&#xff09;&#xff0c;第二个是从RAG中…

转专业(UPC练习)

题目描述 根据教育部的规定&#xff0c;大学生进校后符合条件的可申请转专业。在校本科生在完成大学一年级课程&#xff0c;进入二年级之前&#xff0c;符合以下条件之一者&#xff0c;可以申请转专业&#xff1a;&#xff08;1&#xff09;在某一学科方面确有特长的学生&#…

IPv6路由协议---IPv6动态路由(OSPFv3-5)

OSPFv3各链路状态通告类型 4.Inter-Area-Router-LSA区域间路由器(4类LSA) 边界路由器(ABR)产生的第4类LSA,在Area 范围内泛洪,描述了到本AS内其他区域的ASBR路由器信息; 每各Inter-Area-Router-LSA包含一个ASBR路由器信息,LSA中的能力选项(Options)与所描述的ASBR …

【模块系列】STM32TCS3472

前言 手上正好有TCS3472模块&#xff0c;也正好想在加深一下自己对I2C协议的理解和应用&#xff0c;所以就写了这个代码库出来。参考的资料主要来源于TCS3472的数据手册&#xff0c;和arduino中MH_TCS3472库的宏定义&#xff0c;和函数名称&#xff0c;我就没有重新命名&#x…

【System Verilog and UVM实力进阶2】SVA语法

毛主席说过&#xff1a;没有调查就没有发言权。 《SVA介绍——学习SVA语法》系列第二讲 本文还是延续上一篇的风格&#xff0c;语言内容尽可能简单明了&#xff0c;有问题大家相互讨论&#xff0c;共同进步。需要电子书的朋友可以给我发邮件。tommi.weiqq.com 1.16 "ended…

Spring MVC 参数接收

参数接收 Springmvc中&#xff0c;接收页面提交的数据是通过方法形参来接收&#xff1a; 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型&#xff0c;所以spirngmvc提供了很多converter&#xff08;转换器…

光鉴科技的反卷思维,让科技不再难做

文 | 智能相对论 作者 | 陈壹 中国企业的全球竞争力&#xff0c;正从“拼人力、拼产能”转为“拼技术、拼创新”的新阶段。据世界知识产权组织发布的《世界知识产权指标报告》显示&#xff0c;2022年中国专利申请量约160万件&#xff0c;排名世界第一。而在最近发布的全球百强…

MySQL:索引失效场景总结

1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…

网络安全B模块(笔记详解)- nmap扫描渗透测试

nmap扫描渗透测试 1.通过BT5对服务器场景Linux进行TCP同步扫描 (使用工具Nmap,使用参数n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为Flag提交; Flag:sS 2.通过BT5对服务器场景Linux进行TCP同步扫描 (使用工具Nmap,使用参数n,使用必须要使用的参数…

三大热门婴儿洗衣机测评报告:综合对比希亦/觉飞/鲸立

随着家中新生命的降临&#xff0c;一大批婴儿专用的物品也陆续进入到家中&#xff0c;虽然有很多东西确实能在育儿之路上提供很多帮助&#xff0c;不过也有一些东西“很坑”。婴儿洗衣机这一产品是专为有婴幼儿的家庭或者有特殊需求的人士所研发的&#xff0c;它的容量以及体积…

VMware Visio OmniGraffle模板和图标

VMware Visio OmniGraffle模板和图标 包含可用于Visio、omnigraffle的图标和SVG矢量图。 简介 这组资源适用于 IT 管理员、系统架构师、网络工程师和其他需要可视化 VMware 基础架构的专业人士创建精确的 VMware 网络和数据中心部署图&#xff0c;通过使用这些模板和图标&am…