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

前言

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

LeetCode 启动!

题目:统计好节点的数目

代码与解题思路

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

核心思路:

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

go 复制代码
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) int
    dfs = func(x, fa int) int {
        // 计算好节点数量,sz0 作为第一个子节点,ok 用于判断子节点数量是否相同
        size, sz0, ok := 1, 0, true
        for _, 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,在这种情况下,我们用这种方法进行建图就非常方便:

go 复制代码
    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)
    }      

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

可以和我刷一辈子的每日一题吗?

一题一题,积累起来就是一辈子。

相关推荐
小静AI工程实验室1 分钟前
RSA 算法详解:从模幂原理到 OAEP 加密、PSS 签名与 Python 实验
python·算法
xzal128 分钟前
GESP Python笔记
笔记·python·算法
wzdark10 分钟前
算法中的记忆化思想与重复子问题优化4
算法
Discipline102935 分钟前
流水线运行是否正随时间变得更加集中?
算法
lzhdim1 小时前
C#不为人知的10个魔法特性:资深开发者也会震惊的底层奥秘
java·前端·javascript·算法·c#
weixin_307779131 小时前
C++代码实现MATLAB中的pade函数功能
开发语言·c++·算法·matlab
smj2302_796826521 小时前
解决leetcode第4064题至多一次取反能被k整除的最长子数组II
python·算法·leetcode
AIGC小尼1 小时前
ACE-Step-1.5 本地 AI 音乐模型实战|text2music 歌词转人声,部署脚本、参数调优与排坑全记录
人工智能·算法·comfyui·ai漫剧
YOLO数据集集合1 小时前
树木检测数据集 | 树木检测 树种分类 航拍林业 森林监测9131期
人工智能·算法·机器学习·分类·数据挖掘·林业·树种分类
青山木1 小时前
Hot 100 --- 下一个排列
java·数据结构·算法·leetcode