【Leetcode】671. Second Minimum Node In a Binary Tree
求二叉树中第二小的节点。二叉树每个节点要么是叶子节点要么有两个子节点,并且父节点的值一定小于等于两个子节点的值(注意这里是两个子节点的值大于等于根节点的值,而不是子树)

方法1 DFS遍历+双变量

遍历二叉树的所有节点 ,然后不断更新最小值和次小值。但这样的方法没有用到题目给的其他条件

class Solution1:
    def findSecondMinimumValue(self, root):
        if root == None:
            return -1
        first_min = root.val
        second_min = float("inf")
        stack = [root]
        while(stack):
            node = stack.pop()
            if node.val < first_min:
                second_min = first_min
                first_min = node.val
            elif first_min < node.val < second_min:
                second_min = node.val
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return -1 if second_min == float("inf") else second_min

方法2 分治算法

最小值肯定是root,如果root的left或right值等于root值,那就要递归的去找对应节点下的次小值,然后次小值中选最大,没有次小则返回-1

class Solution2:
    def findSecondMinimumValue(self, root):
        if root == None:
            return -1
        if root.left == None and root.right == None:
            return -1

        left = root.left.val
        right = root.right.val
        if root.val == left:
            left = self.findSecondMinimumValue(root.left)
        if root.val == right:
            right = self.findSecondMinimumValue(root.right)
        if left != -1 and right != -1:
            return min(left, right)
        else:
            return left if right == -1 else right

相关文章: