题干:
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
示例:
输入:root = [2,2,5,null,null,5,7] 输出:5 解释:最小的值是 2 ,第二小的值是 5 。
class Solution {
private int ans = -1;
public int findSecondMinimumValue(TreeNode root) {
dfs(root,root.val);
return ans;
}
public void dfs(TreeNode root,int cur){
if(root==null) return;
if(root.val!=cur){
if(ans==-1) ans = root.val;
else Math.min(ans,root.val);
return ;
}
dfs(root.left,cur);
dfs(root.right,cur);
return;
}
}
深度优先遍历整个树,遇到某个结点的值和根结点不一样则判断ans是否第一次赋值,是第一次就直接赋值,不是第一次就保留ans和当前结点值的较小者,然后直接返回,因为题干说root.val = min(root.left.val, root.right.val) 总成立,故当前结点下的结点的值始终会不小于当前结点的值,而我们要找的是第二小的值,所以没有必要往下继续dfs。