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