也不算是领悟吧,就是一些感想,树的BFS很简单,应该轻车熟路了,就是把节点放在队列中,每次都把他的子节点再放进去,无脑遍历就行了,因为树相当于是有向的图,所以不用标记每个点是否被遍历过,因为每个点肯定都只遍历一次,但是今天遇到了图的BFS,说实话,图一直都没有复习,所以对于这种问题,思路还是没那么清晰的,下面列出此题:
我们首先看这是树的应用,但是慢慢会发现,我们就是一层一层的找,把尽可能多的点都放在一层,最后那一层肯定就是符合要求的,所以我们模拟一下邻接表和出度和入度(这题是无向,题中有显示,变为度),每次把度为1的都加入队列,进行BFS就行啦,剩下最后一层,用链表进行承接,顺便说一下,jdk1.8Hashmap是数组,链表,红黑树,链表长度大于8那么变为红黑树,红黑树数量少于6,那么变为链表,负载因子是0.75.。好啦复习完啦,列出代码:
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> ans = new ArrayList<>();
if (n == 1) {
ans.add(0);
return ans;
}
int[] degree = new int[n];
List<List<Integer>> map = new ArrayList<>();
for (int i = 0; i < n; i++) {
map.add(new ArrayList<>());
}
for (int[] edge : edges) {
degree[edge[0]]++;
degree[edge[1]]++;
map.get(edge[0]).add(edge[1]);
map.get(edge[1]).add(edge[0]);
}
Queue<Integer> queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
if (degree[i] == 1) {
queue.offer(i);
}
}
while (!queue.isEmpty()) {
ans = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
int cur = queue.poll();
ans.add(cur);
List<Integer> nexts = map.get(cur);
for (Integer next : nexts) {
degree[next]--;
if (degree[next] == 1) {
queue.offer(next);
}
}
}
}
return ans;
}
睡觉咯