Skip to the content.

leetcode [671] 二叉树中第二小的节点


Contact me:

Blog -> https://cugtyt.github.io/blog/index
Email -> cugtyt@qq.com
GitHub -> Cugtyt@GitHub


给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。

给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。

示例 1:

输入: 
    2
   / \
  2   5
     / \
    5   7

输出: 5
说明: 最小的值是 2 ,第二小的值是 5 。

示例 2:

输入: 
    2
   / \
  2   2

输出: -1
说明: 最小的值是 2, 但是不存在第二小的值。

解法1: 中序遍历,然后排序

class Solution:
    def findSecondMinimumValue(self, root: TreeNode) -> int:
        if root is None:
            return -1
        queue = [root]
        buff = [root.val]
        while queue:
            for node in queue:
                if node.val not in buff:
                    buff.append(node.val)
                queue = queue[1:]
                if node.left and node.right:
                    queue.append(node.left)
                    queue.append(node.right)
        if len(buff) >= 2:
            buff.sort()
            return buff[1]
        else:
            return -1

来自题解:

递归找第二小,注意递归条件

class Solution:
    def findSecondMinimumValue(self, root: TreeNode) -> int:
        if root is None or root.left is None and root.right is None:
            return -1
        
        left = root.left.val
        right = root.right.val

        if left == root.val:
            left = self.findSecondMinimumValue(root.left)

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