671. 二叉树中第二小的节点

199 阅读1分钟

原题地址:671. 二叉树中第二小的节点

已知条件:

  1. 每个节点都是正数
  2. 每个节点的子节点数量只能为 2 或 0
  3. root.val = min(root.left.val, root.right.val) 总成立

解题思路

图解

本题核心点就是找最小值,只是这个最小值是找左右子树中的的最小值。根据前置条件可知根节点的值root.val一定是整棵树中的最小值,因此,题目需要找的第二小的值实际上就是左右子树中的最小值,明确了问题之后,先画个图分析一下可能存在的几种情况:

图一

1.png

图二

2.png

图三

3.png

情况分析

由于节点值一定是符合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);
    }