原题地址:671. 二叉树中第二小的节点
已知条件:
- 每个节点都是正数
- 每个节点的子节点数量只能为
2或0 root.val = min(root.left.val, root.right.val)总成立
解题思路
图解
本题核心点就是找最小值,只是这个最小值是找左右子树中的的最小值。根据前置条件可知根节点的值root.val一定是整棵树中的最小值,因此,题目需要找的第二小的值实际上就是左右子树中的最小值,明确了问题之后,先画个图分析一下可能存在的几种情况:
图一
图二
图三
情况分析
由于节点值一定是符合root.val = min(root.left.val, root.right.val)该公式,因此当前节点的值一定是以它为根节点的子树中的最小值,所以如果当前节点值与root.val不等时,我们其实就没有必要继续遍历它下面的子节点了,因为它已经是这个子树中的最小值了,它的子节点的值要么与它相等,要么比它大,所以没有继续找下去的必要了,可以直接进行返回;而如果当前节点值与root.val相等时,那么我们就需要对其子节点依次进行遍历,直到节点值与root.val不等为止才做返回,可以参考图二。
源码
int result = -1;
int rootVal = -1;
public int findSecondMinimumValue(TreeNode root) {
rootVal = root.val;
getMin(root);
return result;
}
private void getMin(TreeNode node){
if(node == null){
return;
}
// 当前节点值与根节点的值不一致,不用继续进行循环了,该节点值一定为当前子树下的最小值
if(node.val != rootVal){
if(result == -1){
result = node.val;
} else {
result = result > node.val ? node.val : result;
}
return;
}
getMin(node.left);
getMin(node.right);
}