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

相关推荐
jiaguangqingpanda11 小时前
Day24-20260120
java·开发语言·数据结构
一个龙的传说11 小时前
xshell下载
java
C雨后彩虹11 小时前
羊、狼、农夫过河
java·数据结构·算法·华为·面试
java资料站11 小时前
SpringAI+DeepSeek大模型应用开发实战
java
进击的CJR12 小时前
redis cluster 部署
java·redis·mybatis
重生之后端学习12 小时前
19. 删除链表的倒数第 N 个结点
java·数据结构·算法·leetcode·职场和发展
qq_124987075312 小时前
基于小程序中医食谱推荐系统的设计(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-阅卷评分模块时序图
java·人工智能·spring boot
linweidong12 小时前
C++大型系统中如何组织头文件和依赖树?
java·c++·架构
鹿角片ljp12 小时前
力扣14.最长公共前缀-纵向扫描法
java·算法·leetcode