Second Minimum Node In a Binary Tree

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem

In this tree, root.val = min(left.val, right.val). Find the second minimum value or -1 if not exists.

Key insight: The root is minimum. DFS: look for smallest value > root.val.

Solutions

# Python
def findSecondMinimumValue(root):
    res = [float('inf')]
    min_val = root.val
    def dfs(node):
        if not node:
            return
        if min_val < node.val < res[0]:
            res[0] = node.val
        elif node.val == min_val:
            dfs(node.left)
            dfs(node.right)
    dfs(root)
    return res[0] if res[0] < float('inf') else -1
// C++
int findSecondMinimumValue(TreeNode* root) {
    long res = LONG_MAX;
    int minVal = root->val;
    function<void(TreeNode*)> dfs = [&](TreeNode* node) {
        if (!node) return;
        if (node->val > minVal && node->val < res) res = node->val;
        else if (node->val == minVal) { dfs(node->left); dfs(node->right); }
    };
    dfs(root);
    return res == LONG_MAX ? -1 : res;
}
// Java
long res = Long.MAX_VALUE;
int minVal;
public int findSecondMinimumValue(TreeNode root) {
    minVal = root.val;
    dfs(root);
    return res == Long.MAX_VALUE ? -1 : (int)res;
}
void dfs(TreeNode node) {
    if (node == null) return;
    if (node.val > minVal && node.val < res) res = node.val;
    else if (node.val == minVal) { dfs(node.left); dfs(node.right); }
}
// JavaScript
function findSecondMinimumValue(root) {
    let res = Infinity;
    const minVal = root.val;
    function dfs(node) {
        if (!node) return;
        if (node.val > minVal && node.val < res) res = node.val;
        else if (node.val === minVal) { dfs(node.left); dfs(node.right); }
    }
    dfs(root);
    return res === Infinity ? -1 : res;
}

Complexity

  • Time: O(n)
  • Space: O(h)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro