这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)的更多相关文章

  1. 【LeetCode】671. Second Minimum Node In a Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找出所有值再求次小值 遍历时求次小值 日期 题目地址 ...

  2. Python 解LeetCode:671. Second Minimum Node In a Binary Tree

    题目在这里,要求一个二叉树的倒数第二个小的值.二叉树的特点是父节点的值会小于子节点的值,父节点要么没有子节点,要不左右孩子节点都有. 分析一下,根据定义,跟节点的值肯定是二叉树中最小的值,剩下的只需要 ...

  3. LeetCode题解之Second Minimum Node In a Binary Tree

    1.题目描述 2.问题分析 使用set. 3.代码 set<int> s; int findSecondMinimumValue(TreeNode* root) { dfs(root); ...

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

    671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 ...

  5. 【Leetcode_easy】671. Second Minimum Node In a Binary Tree

    problem 671. Second Minimum Node In a Binary Tree 参考 1. Leetcode_easy_671. Second Minimum Node In a ...

  6. [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree

    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree 链接 leetcode 描述    ...

  7. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  8. LeetCode算法题-Find Smallest Letter Greater Than Target(Java实现)

    这是悦乐书的第306次更新,第326篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第175题(顺位题号是744).给定一个仅包含小写字母的有序字符数组,并给定目标字母目标 ...

  9. LeetCode算法题-Kth Largest Element in a Stream(Java实现)

    这是悦乐书的第296次更新,第315篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第164题(顺位题号是703).设计一个类来查找流中第k个最大元素.请注意,它是排序顺序 ...

随机推荐

  1. Hbase篇--HBase中一对多和多对多的表设计

    一.前述 今天分享一篇关于HBase的一对多和多对多的案例的分析. 二.具体案例 案例一.多对多    人员-角色   人员有多个角色  角色优先级   角色有多个人员   人员 删除添加角色   角 ...

  2. JVM系列第12讲:JVM参数之查看JVM参数

    今天要说的是如何查看 JVM 中已经设置的参数,包括显示参数和隐式参数. 打印显式参数 -XX:+PrintVMOptions 该参数表示程序运行时,打印虚拟机接受到的命令行显式参数.我们用下面的命令 ...

  3. vue + hbuilder 开发备忘录

    踩过的坑: axios 安卓低版本兼容性处理 阻止表单中,button默认事件,出现刷新问题. 设置滚动条的位置 vue 数据和对象数据变化 dom结构不变 android低版本 白屏问题 你是不是用 ...

  4. linux系统安全设置策略

    1.检查是否设置口令长度至少8位,并包括数字,小写字符.大写字符和特殊符号4类中至少2类. 在文件/etc/login.defs中设置 PASS_MIN_LEN 不小于标准值 修改/etc/pam.d ...

  5. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  6. Spring Cloud-微服务架构集大成者

    本文不是讲解如何使用Spring Cloud的教程,而是探讨Spring Cloud是什么,以及它诞生的背景和意义. 1 背景 2008年以后,国内互联网行业飞速发展,我们对软件系统的需求已经不再是过 ...

  7. MySQL 个人学习笔记

    最早之前学习了Mysql,不知道是多长时间了 O(∩_∩)O,今天突然发现之前学习过程中的这个笔记,于是,就分享给大家,希望,能帮助到有需要的朋友,有不足的地方欢迎大家多多交流 b( ̄▽ ̄)d 1. ...

  8. 【SpringCloud】HystrixCommand的threadPoolKey默认值及线程池初始化

    关于threadPoolKey默认值的疑问 使用SpingCloud必然会用到Hystrix做熔断降级,也必然会用到@HystrixCommand注解,@HystrixCommand注解可以配置的除了 ...

  9. springboot情操陶冶-web配置(七)

    参数校验通常是OpenApi必做的操作,其会对不合法的输入做统一的校验以防止恶意的请求.本文则对参数校验这方面作下简单的分析 spring.factories 读者应该对此文件加以深刻的印象,很多sp ...

  10. 从设计模式的角度看Java程序优化

    一.前言 Java程序优化有很多种渠道,比如jvm优化.数据库优化等等,但都是亡羊补牢的措施,如果能在设计程序架构时利用设计模式就把程序的短板解决,就能使程序更加健壮切容易维护迭代 二.常用的设计模式 ...