这是悦乐书的第285次更新,第302篇原创 <br/>node
今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671)。给定非空的特殊二叉树,其由具备非负值的节点组成,其中该树中的每一个节点具备刚好两个或零个子节点。 若是节点具备两个子节点,则该节点的值是其两个子节点中的较小值。给定这样的二叉树,您须要输出由整个树中全部节点的值组成的集合中的第二个最小值。若是不存在这样的第二个最小值,则输出-1。例如:算法
2 / \ 2 5 / \ 5 7
输出:5数据结构
2 / \ 2 2
输出:-1eclipse
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。 <br/>工具
使用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); } }
<br/>测试
咱们也能够不使用HashSet。依旧使用递归,可是将最小值,第二最小值做为了全局变量,最小值只申明,在方法内部初始化为根节点的节点值。在递归方法里,若是当前节点值大于最小值且小于第二小值,那么就更新第二小的值;若是当前节点值等于最小值,就继续遍历其左子节点和右子节点。spa
/** * 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); } } }
<br/>code
针对第一种解法,也可使用迭代的方式。递归
/** * 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; } }
<br/>
针对第二种解法,也可使用迭代的方式。
/** * 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; } }
<br/>
算法专题目前已日更超过四个月,算法题文章153+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!