Second Minimum Node In a Binary Tree
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
← Previous
Construct String from Binary Tree