【图论】拓补排序 – 邻接表

文章目录

  • 题目:310. 最小高度树
    • 题目描述
    • 代码与注释

题目:310. 最小高度树

题目描述

代码与注释

func findMinHeightTrees(n int, edges [][]int) (ans []int) {
    if n == 1 {
        return []int{0}
    }
    g := make([][]int, n)
    degree := make([]int, n) // 记录每个节点的度(之相连的边的数量)
    for _, e := range edges { // 构建邻接表
        a, b := e[0], e[1]
        g[a] = append(g[a], b)
        g[b] = append(g[b], a)
        degree[a]++
        degree[b]++
    }
    q := []int{} // 通过队列存储度为 1 的节点(叶子节点)
    for i, d := range degree {
        if d == 1 {
            q = append(q, i) // 存储所有叶子节点
        }
    }
    for len(q) > 0 { // 把所有叶子节点剥离到最后一层,剩下的节点就可以作为最小高度树的根节点了
        ans = []int{} // 清空 ans
        for i := len(q); i > 0; i-- { // 把当前层的叶子节点都剥离
            a := q[0] // 获取队列中的叶子节点
            q = q[1:]
            ans = append(ans, a)
            for _, b := range g[a] { // 遍历 a 相邻的节点
                degree[b]-- // 相邻节点的度-1
                if degree[b] == 1 { // 新的叶子节点
                    q = append(q, b)
                }
            }
        }
    }
    return ans // 最后剩下的节点就是最小高度树的根
}

主要学习如何记录每个节点的度

版权声明:本文为博主作者:戊子仲秋原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/Locky136/article/details/136781736

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2024年4月16日
下一篇 2024年4月16日

相关推荐