【华为OD题库-050】树状结构查询-java

题目

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

西安 陕西

陕西 中国

江西 中国

中国 亚洲

泰国 亚洲

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

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

接着是查询节点
输出描述

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

树中的节点是唯一的,不会出现两个节点,是同一个名字
示例1:
输入

5

b a

c a

d c

e c

f d

c
输出

d

e

f

思路

简单递归题

先将输入转为map< String , List< String >>,key代表父节点,list代表子节点。有以下两种方案:

  1. 辅助队列法:将key找到的子节点列表加入辅助队列,依次出队,如果碰到某个节点还有子节点的,将它的子节点依次加入队列中
  2. 递归法:然后根据指定key找到子节点列表,如果子节点还有子节点,则递归加入。

题解

java 复制代码
package hwod;

import java.util.*;

public class TreeStructSearch {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        String[][] arrs = new String[n][2];
        for (int i = 0; i < n; i++) {
            arrs[i] = sc.nextLine().split(" ");
        }
        String key = sc.nextLine();
        List<String> res = treeStructSearch(arrs, key);
        for (int i = 0; i < res.size(); i++) {
            System.out.println(res.get(i));
        }
    }
//方案一,辅助队列实现
    private static List<String> treeStructSearch(String[][] arrs, String key) {
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < arrs.length; i++) {
            List<String> oldlist = map.getOrDefault(arrs[i][1], new ArrayList<>());
            oldlist.add(arrs[i][0]);
            map.put(arrs[i][1], oldlist);
        }
        LinkedList<String> queue = new LinkedList<>();
        List<String> targetList = map.getOrDefault(key, new ArrayList<>());
        for (String s : targetList) {
            queue.addLast(s);
        }
        List<String> res = new ArrayList<>();
        while (!queue.isEmpty()) {
            String s = queue.pollFirst();
            res.add(s);
            List<String> subList = map.getOrDefault(s, new ArrayList<>());
            for (String sub : subList) {
                queue.addLast(sub);
            }
        }
        Collections.sort(res);
        return res;

    }
// 方案2,dfs递归
    private static List<String> ans = new ArrayList<>();
    private static List<String> treeStructSearch2(String[][] arrs, String key) {
        Map<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < arrs.length; i++) {
            List<String> oldlist = map.getOrDefault(arrs[i][1], new ArrayList<>());
            oldlist.add(arrs[i][0]);
            map.put(arrs[i][1], oldlist);
        }

        dfs(map, key);
        Collections.sort(ans);
        return ans;
    }

    private static void dfs(Map<String, List<String>> map, String key) {
        if(!map.containsKey(key)) return;
        List<String> subList = map.get(key);
        for (int i = 0; i < subList.size(); i++) {
            ans.add(subList.get(i));
            dfs(map,subList.get(i));
        }
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

相关推荐
aaPIXa62225 分钟前
C++采样引导优化SPGO——比PGO更智能的编译器决策新方案
java·c++·人工智能
蓝银草同学31 分钟前
Stream 实战:博客列表排序、过滤与分页(AI 辅助学习 Java 8)
java·前端·后端
某不知名網友1 小时前
C/C++动态内存管理,智能指针及RAlI思想。
java·c语言·c++
沫离痕2 小时前
Cassandra 4.0.11 Docker 安装与配置手册
java·spring boot
plainGeekDev2 小时前
libs 目录 → Gradle 依赖管理
android·java·kotlin
CodeStride2 小时前
就像长跑配速一样,我是如何平衡代码性能与可读性的
java
弹简特3 小时前
【Java项目-企悦抽】07-用户与认证模块-实现用户注册01
java·开发语言
L歪歪君3 小时前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法
山东点狮信息科技有限公司3 小时前
SpringBoot+VUE3,一套系统完成OA+HRM+CRM+MES+合同+项目管理 —— 深度解析点狮全业务管理平台
java·spring boot·后端
snow@li4 小时前
Java:Java 服务器(Web 容器 / Servlet 容器)完整工作清单
java·服务器·前端