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

相关推荐
Olrookie42 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
倚栏听风雨1 小时前
java.lang.SecurityException异常
java
星河队长2 小时前
VS创建C++动态库和C#访问过程
java·c++·c#
鼠鼠我捏,要死了捏2 小时前
Java虚拟线程原理与性能优化实战
java·performance-optimization·virtual-thread
艾菜籽2 小时前
Spring MVC练习:留言板
java·spring·mvc
左灯右行的爱情3 小时前
4-Spring SPI机制解读
java·后端·spring
Code小翊3 小时前
C语言bsearch的使用
java·c语言·前端
yong99903 小时前
C#驱动斑马打印机实现包装自动打印
java·数据库·c#
好记忆不如烂笔头abc3 小时前
linux系统记录登录用户的所有操作
java·linux·服务器
sp423 小时前
一套清晰、简洁的 Java AES/DES/RSA 加密解密 API
java·后端