【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)
    }      

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

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

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

相关推荐
@宁兰18 小时前
算法实现总结 - C/C++
c语言·c++·算法
Doro再努力19 小时前
2025_11_14洛谷【入门1】数据结构刷题小结
前端·数据结构·算法
蒙奇D索大19 小时前
【算法】回溯算法精讲:从深度优先搜索到剪枝优化
经验分享·笔记·算法·深度优先·剪枝·改行学it
QTreeY12319 小时前
yolov5/8/9/10/11/12/13+deep-oc-sort算法的目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
_OP_CHEN19 小时前
算法基础篇:(六)基础算法之双指针 —— 从暴力到高效的优化艺术
c++·算法·acm·优化算法·双指针·oj题·算法蓝桥杯
cs麦子19 小时前
C语言--详解--指针--下
c语言·数据结构·算法
flashlight_hi19 小时前
LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点
javascript·数据结构·leetcode·链表
Tisfy19 小时前
LeetCode 2536.子矩阵元素加 1:二维差分数组
算法·leetcode·矩阵
北邮刘老师20 小时前
智能家居,需要的是“主控智能体”而不是“主控节点”
人工智能·算法·机器学习·智能体·智能体互联网
oioihoii20 小时前
C++中有双向映射数据结构吗?Key和Value能否双向查找?
数据结构·c++·算法