0671. 二叉树中第二小的节点【简单】
1. 📝 题目描述
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。
更正式地说,即 root.val = min(root.left.val, root.right.val) 总成立。
给出这样的一个二叉树,你需要输出所有节点中的 第二小的值。
如果第二小的值不存在的话,输出 -1。
示例 1:

txt
输入:root = [2,2,5,null,null,5,7]
输出:5
解释:最小的值是 2,第二小的值是 5。1
2
3
2
3
示例 2:

txt
输入:root = [2,2,2]
输出:-1
解释:最小的值是 2, 但是不存在第二小的值。1
2
3
2
3
提示:
- 树中节点数目在范围
[1, 25]内 1 <= Node.val <= 2^31 - 1- 对于树中每个节点
root.val == min(root.left.val, root.right.val)
2. 🎯 s.1 - 深度优先搜索
js
/**
* 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
const minVal = root.val
const dfs = (node) => {
if (!node) return -1
// 如果当前节点值大于最小值,那它就是第二小的值
if (node.val > minVal) {
return node.val
}
// 递归查找左右子树
const left = dfs(node.left)
const right = dfs(node.right)
// 如果左右子树都有大于最小值的节点,返回较小的那个
if (left !== -1 && right !== -1) {
return Math.min(left, right)
}
// 如果只有一个子树有结果,返回那个结果
// 如果两个子树都没有结果,返回 -1(此时两个都是 -1)
// 可以简写为:
return left !== -1 ? left : right
}
return dfs(root)
}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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
- 时间复杂度:
,其中 n 是二叉树中的节点数量,最坏情况下需要遍历所有节点 - 空间复杂度:
,其中 h 是二叉树的高度,主要是递归调用栈的空间消耗 - 算法思路:
- 利用题目描述中树的特殊性质,可以推断出根节点的值是最小值,我们只需要找到比根节点值大的最小值即可。
- 提交结果:
