【华为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找到子节点列表,如果子节点还有子节点,则递归加入。

题解

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

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值