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);
    }
}
相关推荐
QxQ么么2 小时前
移远通信(桂林)26校招-助理AI算法工程师-面试纪录
人工智能·python·算法·面试
better_liang2 小时前
每日Java面试场景题知识点之-分布式事务处理
java·微服务·面试·springcloud·分布式事务
L***d6704 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
凌波粒4 小时前
Springboot基础教程(3)--自动装配原理/静态资源处理/欢迎页
java·spring boot·后端
likuolei4 小时前
XSL-FO 软件
java·开发语言·前端·数据库
凌波粒4 小时前
SpringBoot基础教程(2)--yaml/配置文件注入/数据校验/多环境配置
java·spring boot·后端·spring
S***26754 小时前
Spring Boot环境配置
java·spring boot·后端
6***83054 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
Mz12214 小时前
day05 移动零、盛水最多的容器、三数之和
数据结构·算法·leetcode
毕设源码柳学姐4 小时前
计算机毕设 java 智慧社区服务系统 SSM 框架社区生活平台 Java 开发的便民服务与互动系统
java·开发语言·生活