😲310 minimum height tree
https://leetcode.com/problems/minimum-height-trees/
在无向树中,叶子结点是度为1的节点,也就是只有一个neighbor,我们逐层剥掉叶子节点,最后一层剩下的1或2个节点就是答案 因为它们类似于图的中心 距离其他节点的平均距离更近
由于是无向图 不区分出度入度,也就不需要indegrees array了
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 1) {
return Arrays.asList(n - 1);
}
Map<Integer, Set<Integer>> neighbors = new HashMap<>();
for (int[] edge : edges) {
Set<Integer> nei = neighbors.get(edge[0]);
if (nei == null) nei = new HashSet<>();
nei.add(edge[1]);
neighbors.put(edge[0], nei);
nei = neighbors.get(edge[1]);
if (nei == null) nei = new HashSet<>();
nei.add(edge[0]);
neighbors.put(edge[1], nei);
}
Queue<Integer> queue = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (neighbors.get(i).size() == 1) queue.offer(i);
}
while (n > 2) {
//仍然需要逐层遍历,在每一层结束之后检查n还剩多少
int size = queue.size();
for (int s = 0; s < size; s++) {
int leaf = queue.poll();
Set<Integer> neis = neighbors.get(leaf);
for (int nei : neis) {
neighbors.get(nei).remove(leaf);
if (neighbors.get(nei).size() == 1) queue.offer(nei);
}
n--;
}
}
List<Integer> ans = new ArrayList<>();
while (!queue.isEmpty()) {
ans.add(queue.poll());
}
return ans;
}
}
Last updated