671. Second Minimum Node In a Binary Tree

题干简述:

给我们一个二叉树的根节点,该二叉树有如下特性:

  1. 所有节点值均为非负数;

  2. 所有节点要么有两个子节点,要么没有子节点

  3. 若节点有子节点,则该节点的值必然是其两个子节点中较小的那一个,即 root.val = min(root.left.val, root.right.val)

求解这个二叉树第二小的节点值。

解题思路

本题的特色在于这个二叉树的性质。通过题干,我们可以得知根节点必然是二叉树最小的值,现在要做的,就是找到比根节点大,但是又比其他节点小的值。

暴力解法,就是通过 DFS 遍历,将一个个值存储下来,再找到这些值中第二小的即可。当然,我们也不需要将每个值都存储下来,通过一个变量来维护当前第二小的值就可以了,每次拿到新的值时,只有新的值不等于 root.val且小于这个变量时,才更新这个变量。

题解

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var findSecondMinimumValue = function(root) {
    if (!root) return -1;
    let res = root.val;
    const find = (node) => {
        if (!node) return;
        if (res === root.val && node.val > res) {
            res = node.val;
        }
        if (res !== root.val && node.val < res && node.val > root.val) {
            res = node.val;
        }
        find(node.left);
        find(node.right);
    };
    find(root);
    if (res === root.val) return -1;
    return res;
};

还有一种解题思路,那就是根据题干,root.val = min(root.left.val, root.right.val),我们可以得知,如果一个结点存在子树,那这个节点的值,必然是左右子节点较小的那个,因此,比它大的值,必然会在它的较大的子节点对应的子树,与它较小的子节点子树中出现,举个例子,如果 root.left < root.right,就是 root.left.childroot.right 这两棵树中出现。因此,我们可以通过比较 root.rightfindSecondMinimumValue(root.left)的值,得出第二小的值。

Q.E.D.


Take it easy