题目
通常使用多行的节点、父节点表示—棵树,比如:
西安 陕西
陕西 中国
江西 中国
中国 亚洲
泰国 亚洲
输入一个节点之后,请打印出来树中他的所有下层节点
输入描述
第一行输入行数,下面是多行数据,每行以空格区分节点和父节点
接着是查询节点
输出描述
输出查询节点的所有下层节点。以字典序排序
备注
树中的节点是唯一的,不会出现两个节点,是同一个名字
示例1:
输入
5
b a
c a
d c
e c
f d
c
输出
d
e
f
思路
简单递归题
先将输入转为map< String , List< String >>,key代表父节点,list代表子节点。有以下两种方案:
- 辅助队列法:将key找到的子节点列表加入辅助队列,依次出队,如果碰到某个节点还有子节点的,将它的子节点依次加入队列中
- 递归法:然后根据指定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),查看当前专栏更新的所有题目。