题目地址:
https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/
给定一个非空二叉树,题目保证每个节点的孩子个数只会是 0 0 0或 2 2 2,并且每个节点的值恰好就是其两个孩子的更小值(如果有的话)。求其中的严格第二小的值。如果不存在则返回 − 1 -1 −1。
直接DFS。由于树根就是最小值,在递归的时候如果当前节点大于树根了,则更新答案,可以直接返回了(其子树不可能有要求的解);如果当前节点等于树根,才有可能要继续DFS左右子树。代码如下:
public class Solution {
public int findSecondMinimumValue(TreeNode root) {
if (root == null) {
return -1;
}
long[] A = {root.val, Long.MAX_VALUE};
dfs(root, A);
return A[1] == Long.MAX_VALUE ? -1 : (int) A[1];
}
private void dfs(TreeNode cur, long[] A) {
if (cur == null) {
return;
}
if (cur.val > A[0]) {
A[1] = Math.min(cur.val, A[1]);
return;
}
if (cur.val == A[0]) {
dfs(cur.left, A);
dfs(cur.right, A);
}
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。