Leetcode 671: 二叉树中的第二最小值

Leetcode 671: 二叉树中的第二最小值_第1张图片
Leetcode 671: 二叉树中的第二最小值_第2张图片
Leetcode 671: 二叉树中的第二最小值_第3张图片

想法:
首先,我们可以想到利用深度优先算法遍历这个二叉树。

这个深度优先搜索是有条件,我们只有在node的value等于left的value或者right的value时才会继续,不相等时就会停止。因为root的value是最小的,并且是在left和right之间取一个最小值。所以我们遇到第一个不相等的value时,它就会是我们要找的第二最小值。

如果一直遍历下去,发现left和right全部和root相等,我们会返回-1。

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def findSecondMinimumValue(self, root: Optional[TreeNode]) -> int:
        #如果我们能一直遍历到leaf的位置,证明这条路径的所有value与root的相等。
        if root == None:
            return -1
        
        if root.left == None and root.right == None:
            return -1
        
        l = root.left.val
        r = root.right.val
        
        #我们只有在left value等于root value时,或者right value等于root value时才会进行深度优先搜索。
        if root.val == l:
            l = self.findSecondMinimumValue(root.left)
        if root.val == r:
            r = self.findSecondMinimumValue(root.right)
        
        if (l != -1) and (r != -1):
            return min(l,r)
        #如果l不等于-1,证明r等于-1,r与root相等,返回l的value。
        if l != -1:
            return l
        #如果l等于-1,证明r不等于-1,l与root相等,返回r的value。
        else:
            return r

你可能感兴趣的:(Python,leetcode,leetcode,算法,职场和发展)