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);
    }
}
相关推荐
沐浴露z5 分钟前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
No0d1es25 分钟前
电子学会青少年软件编程(C/C++)1级等级考试真题试卷(2025年9月)
java·c语言·c++·青少年编程·电子学会·真题·一级
小O的算法实验室40 分钟前
2025年TRE SCI1区TOP,随机环境下无人机应急医疗接送与配送的先进混合方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
9号达人1 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
超级苦力怕1 小时前
Java 为何 long a = 999999999 能过;long a = 9999999999 报错?一文讲透“宽化转换”
java
佐杰1 小时前
Jenkins使用指南1
java·运维·jenkins
dllxhcjla1 小时前
三大特性+盒子模型
java·前端·css
小白程序员成长日记1 小时前
2025.11.06 力扣每日一题
算法·leetcode
Acrelhuang1 小时前
筑牢用电防线:Acrel-1000 自动化系统赋能 35kV 园区高效供电-安科瑞黄安南
java·大数据·开发语言·人工智能·物联网
脸大是真的好~1 小时前
黑马JAVAWeb-10 文件上传-文件存储到服务器本地磁盘-文件存储在阿里云OSS-@Value属性注入
java