当前位置: 首页 > news >正文

LeetCode算法题(Go语言实现)_35

题目

给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。
「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。

一、代码实现

func goodNodes(root *TreeNode) int {
    if root == nil {
        return 0
    }
    return dfs(root, root.Val)
}

func dfs(node *TreeNode, maxVal int) int {
    if node == nil {
        return 0
    }
    count := 0
    if node.Val >= maxVal {
        count = 1
        maxVal = node.Val
    }
    count += dfs(node.Left, maxVal)
    count += dfs(node.Right, maxVal)
    return count
}

二、算法分析

1. 核心思路
  • 深度优先遍历:通过前序遍历访问每个节点,实时维护路径最大值
  • 贪心比较:当前节点值若大于等于路径最大值,则标记为好节点并更新最大值
  • 递归分治:将问题分解为左右子树的子问题,合并结果得到总数
2. 关键步骤
  1. 初始化最大值:以根节点值作为初始路径最大值
  2. 递归终止条件:空节点返回0
  3. 节点判断:比较当前节点值与路径最大值,更新计数器和最大值
  4. 递归分解:分别处理左右子树,传递更新后的最大值
3. 复杂度
指标说明
时间复杂度O(n)每个节点访问一次
空间复杂度O(h)h为树的高度(递归栈空间)

三、图解示例

以二叉树[3,1,4,3,null,1,5]为例:

        3
       / \
      1   4
     /   / \
    3   1   5

递归过程

  1. 根节点3:路径最大3 → 好节点(计数1)
  2. 左子节点1:路径最大3 → 不计数
  3. 左子节点的左子3:路径最大3 → 好节点(计数+1)
  4. 右子节点4:路径最大4 → 好节点(计数+1)
  5. 右子节点的左子1:路径最大4 → 不计数
  6. 右子节点的右子5:路径最大5 → 好节点(计数+1)
    总计数:1 + 1 + 1 + 1 = 4

四、边界条件与扩展

1. 特殊场景验证
  • 单节点树:返回1
  • 递减序列:如5→4→3→2 → 返回4(每个节点都是好节点)
  • 负数值:如[-2,null,-3] → 返回1(仅根节点是好节点)
2. 多语言实现
class Solution:
    def goodNodes(self, root: TreeNode) -> int:
        def dfs(node, max_val):
            if not node: return 0
            count = 0
            if node.val >= max_val:
                count = 1
                max_val = node.val
            return count + dfs(node.left, max_val) + dfs(node.right, max_val)
        return dfs(root, root.val)
class Solution {
    public int goodNodes(TreeNode root) {
        return dfs(root, root.val);
    }
    
    private int dfs(TreeNode node, int maxVal) {
        if (node == null) return 0;
        int count = 0;
        if (node.val >= maxVal) {
            count = 1;
            maxVal = node.val;
        }
        return count + dfs(node.left, maxVal) + dfs(node.right, maxVal);
    }
}

五、总结与扩展

1. 核心创新点
  • 路径最大值传递:通过递归参数动态维护路径最大值
  • 高效计数机制:仅需单次遍历即可完成所有判断
  • 空间优化:利用递归栈替代显式栈结构
2. 扩展应用
  • 路径最大值统计:可扩展记录所有路径中的最大值分布
  • 节点标记存储:修改算法以存储所有好节点列表
  • 多条件筛选:结合其他条件(如最小值、奇偶性)扩展筛选逻辑
3. 工程优化方向
  • 迭代实现:用栈模拟递归过程避免栈溢出
  • 并行计算:对左右子树进行并发遍历
  • 缓存优化:对大规模数据预计算路径特征

相关文章:

  • Java面向对象高级(继承、单例、抽象、接口)
  • MySQL学习笔记九
  • ETPNav:基于演进拓扑规划的连续环境视觉语言导航模型
  • VUE中的路由处理
  • 2025我们关注DeepSeek什么?
  • Ollama部署离线大模型
  • 前端跨页面通信完全指南
  • 利用Python requests库爬虫程序示例
  • Spring IOC 容器加载过程
  • C++实现文件断点续传:原理剖析与实战指南
  • Tips:用proxy解决前后端分离项目中的跨域问题
  • 研发效率破局之道阅读总结(1)研发效能
  • Windows 图形显示驱动开发-WDDM 2.0功能_IoMmu 模型
  • 开源推荐#2:Social Auto Upload — 自动化上传视频到社交媒体
  • 已知Word内容格式固定,通过宏实现Word转Excel
  • 【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)
  • 理解 DuckDB 的逻辑计划(Logical Plan)、优化器(Optimizer)和物理执行计划模块的工作流程
  • [Godot] C#简单实现人物的控制和动画
  • Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例
  • 2025年AI生成引擎搜索发展现状与趋势总结​​
  • 受美关税影响,本田预计新财年净利下降七成,并推迟加拿大建厂计划
  • 习近平致电祝贺阿尔巴尼斯当选连任澳大利亚总理
  • 特朗普开启第二任期首次外访:中东行主打做生意,不去以色列
  • 董军同法国国防部长举行会谈
  • 国产水陆两栖大飞机AG600批产首架机完成总装下线
  • 中国恒大:清盘人向香港高等法院申请撤回股份转让