LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

嵌入式Flash控制器FMC缓存与预取机制深度解析与性能优化 在嵌入式系统开发中,CPU与Flash存储器的速度差异是影响实时性能的关键瓶颈。为解决此问题,现代微控制器普遍采用缓存(Cache)和预取(Prefetch)等硬件加速机制。缓存通过存储频繁访问的指令和数据,减少对低速Flash的直接访问;预取则基于程序执行的局部性原理,提前读取后续可能需要的指令或数据。这些技术协同工作,能显著提升指令吞吐效率,降低CPU等待周期,对于电机控制、数字电源等实时性要求高的应用场景至关重要。本文以NXP MC56F84xx系列中的Flash Memory Controller( 阅读详情

这是悦乐书的第285次更新,第302篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671)。给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树中的每个节点具有恰好两个或零个子节点。 如果节点具有两个子节点,则该节点的值是其两个子节点中的较小值。给定这样的二叉树,您需要输出由整个树中所有节点的值组成的集合中的第二个最小值。如果不存在这样的第二个最小值,则输出-1。例如:

    2
   / \
  2   5
     / \
    5   7

输出:5

    2
   / \
  2   2

输出:-1

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用HashSet和递归。将每一个节点值添加进set,然后遍历set,找出其中第二小的值,最后输出即可。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    public int findSecondMinimumValue(TreeNode root) {
        Set<Integer> set = new HashSet<Integer>();
        helper(root, set);
        int min = Integer.MAX_VALUE;
        int second = Integer.MAX_VALUE;
        for (int value : set) {
            if (value < min) {
                second = min;
                min = value;
            } else if (value < second) {
                second = value;
            }
        }
        if (min == second) {
            return -1;
        }
        return second == Integer.MAX_VALUE ? -1 : second;
    }

    public void helper(TreeNode node, Set<Integer> set){
        if (node == null) {
            return ;
        }
        set.add(node.val);
        helper(node.left, set);
        helper(node.right, set);
    }
}

03 第二种解法

我们也可以不使用HashSet。依旧使用递归,但是将最小值,第二最小值作为了全局变量,最小值只申明,在方法内部初始化为根节点的节点值。在递归方法里,如果当前节点值大于最小值且小于第二小值,那么就更新第二小的值;如果当前节点值等于最小值,就继续遍历其左子节点和右子节点。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    int min ;
    int second = Integer.MAX_VALUE;
    public int findSecondMinimumValue(TreeNode root) {
        min = root.val;
        helper(root);
        if (min == second) {
            return -1;
        }
        return second == Integer.MAX_VALUE ? -1 : second;
    }

    public void helper(TreeNode node) {
        if (node == null) {
            return ;
        }
        if (node.val > min && node.val < second) {
            second = node.val;
        } else if (node.val == min) {
            helper(node.left);
            helper(node.right);
        }
    }
}

04 第三种解法

针对第一种解法,也可以使用迭代的方式。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int findSecondMinimumValue(TreeNode root) {
        Set<Integer> set = new HashSet<Integer>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode temp = stack.pop();
            set.add(temp.val);
            if (temp.left != null) {
                stack.push(temp.left);
            }
            if (temp.right != null) {
                stack.push(temp.right);
            }
        }
        int min = Integer.MAX_VALUE;
        int second = Integer.MAX_VALUE;
        for (int value : set) {
            if (value < min) {
                second = min;
                min = value;
            } else if (value < second) {
                second = value;
            }
        }
        if (min == second) {
            return -1;
        }
        return second == Integer.MAX_VALUE ? -1 : second;
    }
}

05 第四种解法

针对第二种解法,也可以使用迭代的方式。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int findSecondMinimumValue(TreeNode root) {
        int min = root.val;
        int second = Integer.MAX_VALUE;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.val > min && node.val < second) {
                second = node.val;
            } else if (node.val == min) {
                if (node.left != null) {
                    stack.push(node.left);
                }
                if (node.right != null) {
                    stack.push(node.right);
                }
            }
        }
        if (min == second) {
            return -1;
        }
        return second == Integer.MAX_VALUE ? -1 : second;
    }
}

06 小结

算法专题目前已日更超过四个月,算法题文章153+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01 当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。 阅读详情

相关推荐

BinaryNode:由节点表示的引用类型键值数据结构,该节点左右链接到子节点

BinaryNode 一种使用参考语义为2节点数据结构定义功能对象的协议。 这是一个2节点,是一个以键/值对作为元素的节点,以及两个子节点,一个在其左侧,一个在其右侧。 因此,递归定义一个二叉树。

4.2二叉树

学习总结 4.2.1二叉树的定义与分类 1.二叉树的递归定义 二叉树(Binary Tree)是一种重要的树结构,它的特点是每一个结点最多只能有两棵子树。二叉树的递归定义如下:二叉树或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树。 由二叉树定义可以看出,二叉树中每一个结点的孩子只能是0、1或2个,并且每一个孩子都有左右之分。位于左边的孩子称为左孩子,位于右边的孩子称为右孩子;以左孩子为根的子树称为左子树,以右孩子为根的...

xiexieya233的博客 2417

Android 16(API 36)状态栏颜色适配全攻略:从沉浸式到自定义背景

本文全面解析Android 16(API 36)强制沉浸式状态栏带来的适配挑战,提供了从FrameLayout包裹法到动态修改Window背景色的核心解决方案。针对传统状态栏颜色设置失效问题,详细阐述了如何利用WindowInsets API实现自定义背景,并涵盖全屏模式、Fragment切换及第三方ROM兼容性等实战场景,为开发者提供一站式适配指南。

weixin_29227425的博客 596

源代码 基础功二叉树层序遍历,欢迎拿走

# 二叉树层序遍历 ```java public class BinaryNode { private Object data ; private BinaryNode left ; private BinaryNode right ; public BinaryNode() { } public BinaryNode(Object data, BinaryNode left, BinaryNode right) { this.data ...

m0_66194642的博客 355

亚博k210视觉模块与stm32双向通信

【代码】亚博k210视觉模块与stm32双向通信。

w_150831的博客 3246

施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态

本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。

weixin_33701617的博客 328

java binarynode_java 二叉查找树(增删改查操作)

[java]代码库/*** java 二叉查找树(增删改查操作)*/public class Main{public static void main ( String[] args ){BinarySearchTree btr = new BinarySearchTree();btr.insert ( 6 );btr.insert ( 2 );btr.insert ( 1 );btr.inser...

weixin_42510460的博客 543

Android HCE模拟NFC标签:实现跨设备NDEF数据共享

本文详细介绍了Android HCE技术如何模拟NFC标签实现跨设备NDEF数据共享。通过核心代码实现和标准AID配置,使手机能够被第三方NFC应用直接读取,支持文本、网址、Wi-Fi配置等多种数据类型,大幅提升设备间数据交换的便捷性和兼容性。

pytorch8learner的博客 251

java binarytreenode_LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)

这是悦乐书的第285次更新,第302篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671)。给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树中的每个节点具有恰好两个或零个子节点。 如果节点具有两个子节点,则该节点的值是其两个子节点中的较小值。给定这样的二叉树,您需要输出由整个树中所有节点的值组成的集合中的第二个最小值。如果不存在这样的第二个最...

weixin_35650074的博客 173

FFTW3库在Windows中的安装和使用

Windows 32位平台下载:FFTW Installation on Windows。

weixin_45397344的博客 951

代谢组数据分析(二十二):代谢组原始数据Zscore标准化和主成分分析(PCA)及热图

本教程介绍了使用Z-score标准化和主成分分析(PCA)进行代谢组学数据预处理和分析的方法。代谢物原始数据具有高噪声、高维小样本、高变异性和复杂相互作用关系等特点,因此在数据分析时需注意数据质量控制、参数选择、批次效应、假阳性控制等问题。Z-score标准化通过将数据转换为均值为0、标准差为1的标准正态分布,提高了数据的可比性,减少了系统误差,并适应了统计分析方法的需求。PCA则通过降维、去相关和特征提取,帮助理解数据的结构和模式。教程还详细介绍了数据预处理步骤,包括填补缺失值、设置名称和顺序等,并提供了

专注生信领域 2863

Leetcode——671. Second Minimum Node In a Binary Tree

题目原址 https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ 题目描述 Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in...

想当厨子的程序媛 271

YOLOv11涨点改进| Kimi团队 2026 |独家创新首发、注意力改进篇|爆火AttnRes残差自注意力模块,含多种创新改进,借助残差思想,缓解细节信息在传播过程中被稀释,促进YOLOv11涨点

🔥本文提出AttnRes残差自注意力模块,通过深度维度的注意力加权机制替代传统固定残差累加方式,使YOLOv11网络能自适应选择更有价值的历史层特征进行聚合。该方法缓解了浅层细节信息在深层传播过程中被稀释的问题,有效融合浅层纹理与深层语义特征,提升小目标、密集目标和复杂场景的检测能力。AttnRes还改善了深层网络的梯度分布与训练稳定性,增强模型收敛质量和泛化能力。实验表明,该模块能以较小计算开销显著提升YOLOv11的特征表达能力、检测精度和整体鲁棒性。文中详细介绍了模块结构、实现原理、优势特点

Ai缝合怪、助力小伙伴高效发论文 126

leetcode 671 Second Minimum Node In a Binary Tree

Java class Solution { public int findSecondMinimumValue(TreeNode root) { if(root==null) return -1; if(root.left==null && root.right==null) return -1; int left=roo

MRxjh的博客 343

使用阿里天池平台训练YOLO目标检测模型

YOLO算法是一种单阶段目标检测算法,由Joseph Redmon等人于2015年提出。与传统的两阶段检测算法相比,YOLO将目标检测问题转化为回归问题,直接预测边界框的位置和类别概率,大大提高了检测速度。YOLOv1: 首次提出YOLO的核心思想,将图像分割成网格,每个网格预测边界框和类别概率。YOLOv2: 引入了批量归一化、锚框等改进,提高了检测精度。YOLOv3: 采用多尺度预测,增强了对小目标的检测能力。

步子哥的博客 1091

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LeetCode——671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree)[简单]——分析及代码(Java)

LeetCode——671. 二叉树中第二小的节点[Second Minimum Node In a Binary Tree][简单]——分析及代码[Java]一、题目二、分析及代码1. 遍历 + 剪枝(1)思路(2)代码(3)结果三、其他 一、题目 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。 更正式地说,root.val = min(root.left.val

江南土豆的博客 322

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9

671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。 给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1。 每日一算法2019/...

weixin_30852451的博客 110

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LeetCode Second Minimum Node In a Binary Tree

原题链接在这里:https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ 题目: Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in ...

weixin_30325793的博客 66

【Leetcode】671. Second Minimum Node In a Binary Tree

求二叉树中第二小的节点。二叉树每个节点要么是叶子节点要么有两个子节点,并且父节点的值一定小于等于两个子节点的值(注意这里是两个子节点的值大于等于根节点的值,而不是子树) 方法1 DFS遍历+双变量 遍历二叉树的所有节点 ,然后不断更新最小值和次小值。但这样的方法没有用到题目给的其他条件 class Solution1: def findSecondMinimumValue(self, r...

很吵请安静 371

(Java)leetcode-671 Second Minimum Node In a Binary Tree(二叉树中第二小的节点)

后序遍历...

不思量 302

LeetCode - 671. Second Minimum Node In a Binary Tree(寻找二叉树中第二小的结点)

LeetCode671-Second Minimum Node In a Binary Tree(寻找二叉树中第二小的结点) 非递归BFS 递归DFS 题目链接 题目 非递归BFS 使用一个变量min来记录比root.val大的数,而且这个数将会是这些比root.val大的数中的最小的数; 直接使用BFS遍历即可,但是这个题目有个性质,这可以让我们优化这个题目,即任意一个结点的孩子结点都...

zxzxin的博客~ 356

671. Second Minimum Node In a Binary Tree - Easy

Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactlytwoorzerosub-node. If the node has two sub-nodes, then this node's va...

weixin_34077371的博客 145

[leetcode]671. Second Minimum Node In a Binary Tree二叉树次小结点

Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactlytwoorzerosub-node. If the node has two sub-nodes, then this node's va...

weixin_30538029的博客 80

leetcode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) java beat 100%

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。  给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。 示例 1: 输入: 2 / \ 2 5 / \ 5 7 输出: 5 说明: 最小的值是...

一叶之修的博客 448

[LeetCode-55]Minimum Depth of Binary Tree

Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. Analysis: we could solve this i

coder 进阶的专栏 7028

java binarynode_nodejs和java加密通信问题

现在是有一个需求,是在node端向java端发起一个请求,java端接收这个请求,在请求的过程中要进行加密,在java端使用的是“DES/CBC/PKCS5Padding”,在node端想通过“createDecipheriv”来实现,但是怎么匹配都不行,下面是node端的代码,大家帮忙看看是哪里不对,辛苦各位了。加密方法:var crypto=require('crypto');var encr...

weixin_42499004的博客 178
上一篇: LeetCode算法题-Trim a Binary Search Tree(Java实现)
下一篇: LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值