📌  相关文章
📜  给定二叉树的第二个唯一最小值,其每个节点都是其子节点中的最小值(1)

📅  最后修改于: 2023-12-03 14:56:53.226000             🧑  作者: Mango

给定二叉树的第二个唯一最小值,其每个节点都是其子节点中的最小值
问题描述

给定一个二叉树,每个节点的值都是其子节点中的最小值。请编写一个函数,找到该二叉树中第二个唯一最小的值。如果不存在第二个最小值,则返回 -1。

示例

示例1:

输入:

      2
     / \
    2   5
       / \
      5   7

输出: 5

解释: 根节点的值为 2 ,其子节点中的最小值为 2 和 5 。第二个唯一的最小值是 5 。因此输出 5 。

示例2:

输入:

      2
     / \
    2   2

输出: -1

解释: 根节点的值为 2 ,其子节点中的最小值为 2 。在整棵树中只有一个最小值,因此返回 -1 。

解题思路
  1. 可以通过深度优先搜索查找最小值和次小值,但实际上可以通过比较两个子节点的值来查找最小值和次小值。如果当前节点小于根节点,则将根节点的值赋给当前节点的父节点;否则,将当前节点的值赋给根节点。
  2. 如果根节点的值等于其子节点中的最小值,则递归地在左右子树中查找次小值。否则,返回根节点的值。
代码实现
def findSecondMinimumValue(root: TreeNode) -> int:
    if not root:
        return -1

    def dfs(node, val):
        if not node:
            return -1
        
        if node.val > val:
            return node.val
        left = dfs(node.left, val)
        right = dfs(node.right, val)
        if left == -1:
            return right
        if right == -1:
            return left
        return min(left, right)

    res = dfs(root, root.val)
    return res if res != -1 else -1

返回的是markdown格式的代码片段。