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);
    }
}
相关推荐
帅逼码农9 分钟前
有限域、伽罗瓦域、扩域、素域、代数扩张、分裂域概念解释
算法·有限域·伽罗瓦域
点点滴滴的记录13 分钟前
Java的CompletableFuture实现原理
java·开发语言·javascript
xiaolingting13 分钟前
Java 引用是4个字节还是8个字节?
java·jvm·引用·指针压缩
Jayen H14 分钟前
【优选算法】盛最多水的容器
算法
一只傻小白,18 分钟前
JAVA项目中freemarker静态模板技术
java·开发语言
袁庭新18 分钟前
Spring Boot项目接收前端参数的11种方式
java·springboot·袁庭新·如何接收前端数据·boot接收数据
机跃20 分钟前
递归算法常见问题(Java)
java·开发语言·算法
<但凡.32 分钟前
题海拾贝:蓝桥杯 2020 省AB 乘法表
c++·算法·蓝桥杯
程序员-小李40 分钟前
餐厅下单助手系统(Java+MySQL)
java·开发语言·mysql
开心工作室_kaic44 分钟前
springboot496基于java手机销售网站设计和实现(论文+源码)_kaic
java·开发语言·智能手机