概述
LeetCode——671. 二叉树中第二小的节点[Second Minimum Node In a Binary Tree][简单]——分析及代码[Java]
- 一、题目
- 二、分析及代码
- 1. 遍历 + 剪枝
- (1)思路
- (2)代码
- (3)结果
- 三、其他
一、题目
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例 1:
输入:root = [2,2,5,null,null,5,7]
输出:5
解释:最小的值是 2 ,第二小的值是 5 。
示例 2:
输入:root = [2,2,2]
输出:-1
解释:最小的值是 2, 但是不存在第二小的值。
提示:
- 树中节点数目在范围 [1, 25] 内
- 1 <= Node.val <= 2^31 - 1
- 对于树中每个节点 root.val == min(root.left.val, root.right.val)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 遍历 + 剪枝
(1)思路
根据题中二叉树的特点,对任意子树,其根节点一定是子树中最小的节点。因此,对树进行遍历,寻找超过根节点的最小节点值即可。
在此基础上可进一步剪枝,对值较大的子节点,它的子树中的节点值一定不小于当前子节点的值。而本题只要求求解第二大的值,因此只需记录该节点的值,无需对它的子树展开遍历。
(2)代码
class Solution {
long ans = Long.MAX_VALUE;//根据Node.val的范围,将ans设置为不可能到达的大值
public int findSecondMinimumValue(TreeNode root) {
check(root);//遍历各个节点
return (ans == Long.MAX_VALUE) ? -1 : (int)ans;//判断是否第二小的值并返回
}
public void check(TreeNode node) {
if (node.left == null)//叶子节点,跳过
return;
if (node.left.val == node.right.val) {//两个子节点值相同,第二小的值可能存在于任一子树中,都需遍历
check(node.left);
check(node.right);
} else if (node.left.val < node.right.val) {//左子节点值较小
check(node.left);//第二小的值可能存在于左子树中,继续遍历
ans = Math.min(ans, node.right.val);//右子节点的值可能为第二小的值,且右子树中其他节点值都大于该节点,可剪枝
} else {//右子节点值较小,处理过程同上
check(node.right);
ans = Math.min(ans, node.left.val);
}
return;
}
}
(3)结果
执行用时 :0 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :35.6 MB,在所有 Java 提交中击败了 77.23% 的用户。
三、其他
暂无。
最后
以上就是结实金毛为你收集整理的LeetCode——671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree)[简单]——分析及代码(Java)一、题目二、分析及代码三、其他的全部内容,希望文章能够帮你解决LeetCode——671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree)[简单]——分析及代码(Java)一、题目二、分析及代码三、其他所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复