这个题要善于利用这棵Binary tree的特点,它的每个根节点都和左右子树中val较小的那个节点值相同。
首先我们排除root为空和左右子树为空的情况,肯定是找不到second minimum的;然后我们先初始化int left, right为左右节点的值。然后我们看左右子树哪个和根结点值相等。找到相等的,我们就在对应的子树调用这个函数。这里有2种情况:只有一颗子树值与根结点相等;两颗子树值都与根结点相等。
如果只有一颗子树的值与根结点相等,那么我们知道另一颗子树的值是大于它俩的;而且我们也知道,另一颗大于他俩的子树的子树中只有可能有更大的值,所以我们不去搜索该子树了。我们对与根结点值相等的那颗子树调用该函数,返回该子树中第二小的节点。最后我们把这个值跟最开始不等于根结点子树的值比较,较小的那个就是我们要找的第二小的值;
还有一种情况是两边都跟根结点值一样,那么我们就会两边都调用函数,返回两边子树的第二小的节点值。这里我们要分几种情况,如果两边都找得到返回了有效值,我们就挑其中最小的;如果一边找到了一边找不到,也就是有一边返回了-1,那我们知道这边肯定本身就是最小节点了。这时候我们直接返回找到的那边找到的值就行了。如果两边都找不到,说明两边都是他们所在子树最小的值,并且找不到第二小的值,所以直接返回-1就好了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int findSecondMinimumValue(TreeNode root) {
if (root == null || (root.left == null && root.right == null)){
return -1;
}
int left = root.left.val;
int right = root.right.val;
if (left == root.val){
left = findSecondMinimumValue(root.left);
}
if (right == root.val){
right = findSecondMinimumValue(root.right);
}
if (left != -1 && right != -1){
return Math.min(left, right);
}
if (left != -1){
return left;
}
if (right != -1){
return right;
}
return -1;
}
}