欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

2025/7/30 23:40:23 来源:https://blog.csdn.net/Locky136/article/details/143766074  浏览:    关键词:【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言

每天和你一起刷 LeetCode 每日一题~

LeetCode 启动!

题目:统计好节点的数目

代码与解题思路

先读题:题目要求我们找出好节点的数量,什么是好节点?“好节点的所有子节点的数量都是相同的”,拿示例一举例,0 是好节点,因为他的子节点 1 和 2 拥有的子节点数量都是 2,子节点数量相同,以此类推,所有叶子节点也都是好节点~

核心思路:

我们只需要在遍历计算树的每个节点数量的同时,判断当前节点的每个子节点的数量是否相同即可,我的方法是通过记录一个 sz0 作为子节点数量的比较对象,判断是否出现数量不同的子节点,具体操作代码如下:

func countGoodNodes(edges [][]int) (ans int) {// 题目给了一棵无向树,先建树/图g := make([][]int, len(edges)+1)for _, e := range edges {x, y := e[0], e[1]g[x] = append(g[x], y)g[y] = append(g[y], x)}      // 递归计算节点子树的节点数量var dfs func(int, int) intdfs = func(x, fa int) int {// 计算好节点数量,sz0 作为第一个子节点,ok 用于判断子节点数量是否相同size, sz0, ok := 1, 0, truefor _, y := range g[x] { // 遍历下一个节点if y == fa { // 只往下递归(树)continue}sz := dfs(y, x) // y 的子节点的数量if sz0 == 0 {sz0 = sz} else if sz0 != sz { // 有子节点数量不同ok = false}size += sz}if ok == true { // 子节点数量都相同,是好节点ans++}return size} dfs(0, -1)return ans
}

常用模板积累:

建图/树,在力扣或者其他的 OJ 中,一般都会给出一个二维的 edges 数组,其中的每一个小数组都代表:节点1 -> 节点2,在这种情况下,我们用这种方法进行建图就非常方便:

    g := make([][]int, len(edges)+1)for _, e := range edges {x, y := e[0], e[1]g[x] = append(g[x], y)g[y] = append(g[y], x)}      

每天进步一点点,我们明天不见不散~

可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词