671. Second Minimum Node In a Binary Tree
题干简述:
给我们一个二叉树的根节点,该二叉树有如下特性:
-
所有节点值均为非负数;
-
所有节点要么有两个子节点,要么没有子节点
-
若节点有子节点,则该节点的值必然是其两个子节点中较小的那一个,即
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.child
与root.right
这两棵树中出现。因此,我们可以通过比较 root.right
与 findSecondMinimumValue(root.left)
的值,得出第二小的值。
Q.E.D.