力扣-671-找出二叉树中第二小的结点

题目:
671. Second Minimum Node In a Binary Tree(easy)


题目大意:
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。

给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。


解题思路:
一个节点要么具有 0 个或 2 个子节点,如果有子节点,那么根节点是最小的节点。
依旧是递归思想的应用。


代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Java:
public int findSecondMinimumValue(TreeNode root){
if(root == null) return -1;
if(root.left == null && root.right == null) return -1;//没有第二小的节点

//找出候选数,默认就是子节点值
int leftVal = root.left.val;
int rightVal = root.right.val;

//如果子节点和父节点值相同,递归,重新在子树中寻找候选数
if(leftVal == root.val) leftVal = findSecondMinimumValue(root.left);
if(rightVal == root.val) rightVal = findSecondMinimumValue(root.right);

//如果左右候选数都存在第二小的值,那就返回其中的较小值
if(leftVal != -1 && rightVal != -1) return Math.min(leftVal,rightVal);

//如果候选数有-1,说明整个子树中没有可供候选的数
if(leftVal != -1){
//左子树正常,答案就是左边的候选数
return leftVal;
}
else{
//右子树正常,返回答案
//或者右子树也没有候选数,返回-1,即right
return rightVal;
}
}