python取第二小值_yiduobo的每日leetcode 671.二叉树中第二小的节点

本文介绍了如何使用Python解决LeetCode的671题,即在二叉树中找到第二小的节点。题目规定树的每个节点最多有两个孩子,并且最小节点位于根节点。通过递归策略,分析了四种不同情况来确定第二小节点,最后给出了完整的Python代码实现。
摘要由CSDN通过智能技术生成

820a1a46095140e7929c89ba3bc1fa2a.png

祖传的手艺不想丢了,所以按顺序写一个leetcode的题解。计划每日两题,争取不卡题吧。

671.二叉树中的第二小的节点

力扣​leetcode-cn.com

题目中的二叉树有两个性质,一个是任意节点的孩子个数只会是0或者2,另一个则是任意子树最小的节点必然是根节点。

对于某个子树,设其根节点为now,那么有下面几种情况:

1、若now没有左右孩子,那么这颗子树不存在第二小的节点,返回-1。

2、若now的值等于now.left的值,且now的值等于now.right的值:

此时now、now.left以及now.right的值都是树中最小的值,那么需要分别递归求解左右子树中的第二小的节点,然后取其中较小的那个。

3、若now的值等于now.left的值,但now的值不等于now.right的值:

此时now、now.left的值是树中最小的值,now.right的值是右子树中的最小值,且now.right.val > now.val。那么我们还需要递归求解左子树中的第二小的值,然后跟now.right.val进行比较,其中较小的就是树中第二小的值。

4、若now的值等于now.right的值,但now的值不等于now.left的值:

此时是情况3的镜像,只需要递归求解右子树中的第二小的值,然后跟now.left.val比较。

我们从根节点开始执行上面的求解过程,就可以得到整棵树的第二小值了。

最后附上python代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def findSecondMinimumValue(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """

        return self.find(root)

    def find(self, now):
        if not now.left:
            return -1

        if now.left.val == now.val:
            if now.right.val == now.val:
                second_l = self.find(now.left)
                second_r = self.find(now.right)
            else:
                second_l = self.find(now.left)
                second_r = now.right.val
        else:
            second_l = now.left.val
            second_r = self.find(now.right)
        
        if second_l == -1:
            return second_r
        elif second_r == -1:
            return second_l
        else:
            return min(second_l, second_r)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值