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

这是一篇关于LeetCode第671题的解析,题目要求在特殊的二叉树中找到第二小的节点。文章介绍了如何通过遍历和剪枝策略来解决这个问题,并给出了Java实现代码,最终实现了在所有Java提交中击败100%用户的高效解决方案。
摘要由CSDN通过智能技术生成

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

一、题目

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 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% 的用户。

三、其他

暂无。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值