【华为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),查看当前专栏更新的所有题目。

相关推荐
float_六七2 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天3 小时前
JAVA stream().flatMap()
java·windows
颜如玉4 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年5 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152876 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草6 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6926 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea7 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha7 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统