java数据结构与算法刷题-----LeetCode671. 二叉树中第二小的节点

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

解题思路
  1. 题意表明,每个结点,都<=它的子树,也就是一个结点的后代一定不会比它大
  2. 则,根结点必然最小
  3. 而比根节点大的都可能是第二小的值
  4. 但是如果我们已经找到一个比根结点大的值了,记为minTwo,然后又发现了一个比这个minTwo大的,那么它必然不是第二小的,它的子树比它还大,就更不可能是了。所以遇到这种情况,就可以放弃这颗子树的遍历
  5. 直到最终所有结点遍历完成,找到那个比根结点的值大,但除根结点这个值外,最小的那个
代码
java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int minTwo = -1;//第二小的值,没找到返回-1
    int minOne;//最小值
    public int findSecondMinimumValue(TreeNode root) {
        minOne = root.val;//最小值就是根结点
        dfs(root);//深度优先
        return minTwo;
    }
    public void dfs(TreeNode root){
        if(root == null) return;
        //如果minTwo找到了,但是当前结点值比它大,则无需向下继续遍历,因为下面的值肯定比当前结点更大
        if(minTwo != -1 && root.val >= minTwo ) return;
        if(root.val > minOne) minTwo = root.val;//如果当前值比最小值大,但是小于minTwo,那么它就是当前第二小
        dfs(root.left);
        dfs(root.right);
    }
}
相关推荐
2601_962063971 分钟前
Spring Boot拦截器(Interceptor)详解
java·spring boot·后端
这是程序猿3 分钟前
深入剖析Java HashMap:底层原理、数据结构与核心机制全解析
java·开发语言·数据结构
不才不才不不才5 分钟前
Spring 源码系列(25): @EnableTransactionManagement 与 TransactionInterceptor
java·数据库·spring
nike0good15 分钟前
CF 126B(Password-z algorithm/exkmp)
开发语言·c++·算法
隔窗听雨眠21 分钟前
CI/CD测试数据清理完全指南:从污染根因到三层清理覆盖的完整方案
java·数据库·ci/cd
Query*26 分钟前
Agent 开发之项目 AI 能力自我进化:通过浏览器自动化与数据采集实现持续学习
java·人工智能·ai·自动化
无定义_29 分钟前
Bellman-Ford——贝尔曼福特算法
数据库·算法
晓晓_za89866837 分钟前
GEO 搜索源码白帽合规改造:适配各大 AI 信源收录规则
java·开发语言·人工智能·性能优化·开源
Haooog38 分钟前
从 Tool Calling 到 State 并发控制:一个 Agent 如何安全地连续执行任务
java·agent·后端开发
君顾11 小时前
从0到1课后辅导管理系统开发实战:需求文档、架构设计全复盘
java·开发语言