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);
    }
}
相关推荐
殷色玫瑰5 分钟前
C++入门基础复习:从命名空间到引用与nullptr,一篇重新捡回C++基础
java·开发语言·c++
做运维的阿瑞35 分钟前
多表查询基础:INNER JOIN、LEFT JOIN、RIGHT JOIN
数据库·sql·mysql·算法
大侠归来1 小时前
C语言素数判断:从入门到进阶
java·c语言·算法
谢亮_vipxieliang1 小时前
Spring Boot 自动配置原理:从 @SpringBootApplication 到自定义 Starter
java·spring boot·后端
v:PLLucky201 小时前
农作物病虫害检测识别系统
深度学习·scrapy·算法·百度·微信公众平台
朝朝辞暮i1 小时前
C++ 第一阶段总结:从零基础到 ROS2 前置语法
开发语言·c++·算法
朝朝辞暮i2 小时前
C++ 第 25 课:getter / setter + this
java·javascript·c++
蜗牛互联网2 小时前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
java·javascript·网络·人工智能·python
H.莓飛2 小时前
【数据结构】链表_OJ题
linux·数据结构·算法·链表
用户094248568032 小时前
第22章:JIT编译分层——Interpreter、C1、C2与热点探测
java·jvm