# 671. Second Minimum Node In a Binary Tree

#### Easy (Medium)

***

Given a non-empty special binary tree consisting of nodes with the non-negative value, where each node in this tree has exactly `two` or `zero` sub-node. If the node has two sub-nodes, then this node's value is the smaller value among its two sub-nodes. More formally, the property `root.val = min(root.left.val, root.right.val)` always holds.

Given such a binary tree, you need to output the **second minimum** value in the set made of all the nodes' value in the whole tree.

If no such second minimum value exists, output -1 instead.

&#x20;

&#x20;

**Example 1:**

![](https://assets.leetcode.com/uploads/2020/10/15/smbt1.jpg)

```
Input: root = [2,2,5,null,null,5,7]
Output: 5
Explanation: The smallest value is 2, the second smallest value is 5.
```

**Example 2:**

![](https://assets.leetcode.com/uploads/2020/10/15/smbt2.jpg)

```
Input: root = [2,2,2]
Output: -1
Explanation: The smallest value is 2, but there isn't any second smallest value.
```

&#x20;

**Constraints:**

* The number of nodes in the tree is in the range `[1, 25]`.
* `1 <= Node.val <= 231 - 1`
* `root.val == min(root.left.val, root.right.val)` for each internal node of the tree.

```python
class Solution:
    def findSecondMinimumValue(self, root: Optional[TreeNode]) -> int:
        result = float("inf")
        minimum = root.val
        def traverse(root):
            nonlocal result, minimum
            if root is None:
                return
            if result > root.val and minimum < root.val:
                result = root.val
                return
            traverse(root.left)
            traverse(root.right)
        traverse(root)
        return result if result != float("inf") else -1
            
```
