文章目录
- [310. 最小高度树](https://leetcode.cn/problems/minimum-height-trees/)
- 思路:拓扑排序
- 代码:
 
 
 
 
310. 最小高度树

 
思路:拓扑排序
- 首先判断节点数量n,如果只有一个节点,则直接返回该节点作为最小高度树的根节点。
- 构建邻接表g和度数数组degree: 
  - 使用邻接表g存储每个节点的相邻节点。
- 使用度数数组degree存储每个节点的度数(即相邻节点的数量)。
 
- 遍历边数组edges,构建邻接表g和更新度数数组degree: 
  - 对于每条边[e[0], e[1]],将节点e[0]与节点e[1]互相添加到各自的邻接表中,同时更新它们的度数。
 
- 初始化队列q,并将所有叶子节点(度数为1的节点)加入队列: 
  - 遍历所有节点,将度数为1的节点加入队列q。
 
- 使用BFS遍历叶子节点层级,不断更新度数并将新的叶子节点加入队列: 
  - 从队列中取出当前层级的叶子节点,更新其相邻节点的度数。
- 若相邻节点的度数更新为1,则将其加入队列q。
 
- 最终队列中剩下的节点即为最小高度树的根节点列表,将其返回作为结果。
代码:
class Solution {
    public List<Integer> findMinHeightTrees(int n, int[][] edges) {
        // 如果只有一个节点,直接返回该节点
        if (n == 1) {
            return List.of(0);
        }
        // 构建邻接表
        List<Integer>[] g = new List[n];
        Arrays.setAll(g, k -> new ArrayList<>());
        int[] degree = new int[n]; // 存储每个节点的度数
        for (int[] e : edges) {
            int a = e[0], b = e[1];
            g[a].add(b);
            g[b].add(a);
            ++degree[a];
            ++degree[b];
        }
        Deque<Integer> q = new ArrayDeque<>();
        // 将所有叶子节点(度数为1)加入队列
        for (int i = 0; i < n; ++i) {
            if (degree[i] == 1) {
                q.offer(i);
            }
        }
        List<Integer> ans = new ArrayList<>();
        while (!q.isEmpty()) {
            ans.clear(); // 清空结果列表
            // 遍历当前层的节点
            for (int i = q.size(); i > 0; --i) {
                int a = q.poll();
                ans.add(a); // 将当前节点加入结果列表
                // 更新与当前节点相邻的节点的度数
                for (int b : g[a]) {
                    if (--degree[b] == 1) {
                        q.offer(b); // 若更新后度数为1,则加入队列
                    }
                }
            }
        }
        return ans; // 返回最终结果列表
    }
}
点击移步博客主页,欢迎光临~




















