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

题目说明

  • 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 20。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。

    更正式地说,root.val = min(root.left.val, root.right.val) 总成立。

    给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1

  • 提示:

    • 树中节点数目在范围 [1, 25]
    • 1 <= Node.val <= 2^31 - 1
    • 对于树中每个节点 root.val == min(root.left.val, root.right.val)

示例

示例 1:

img

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

示例 2:

img

1
2
3
输入:root = [2,2,2]
输出:-1
解释:最小的值是 2, 但是不存在第二小的值。

笔者理解

此题是一道二叉树算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,笔者采用了DFS和TreeSet的方式,虽然不是比较高效的方法,但是旨在学习这两种方法或工具类,让我们来看看具体如何实现的吧。

实现

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
43
44
45
46
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
/*
* 数
* DFS
* 先序遍历
*/
public int findSecondMinimumValue(TreeNode root) {
Deque<TreeNode> deque = new ArrayDeque<>();
TreeSet<Integer> set = new TreeSet<>();

while (root != null || deque.size() != 0) {
while (root != null) {
set.add(root.val);
deque.push(root);
root = root.left;
}
root = deque.pop();
root = root.right;
}

// 移除最小的
set.pollFirst();

if (set.size() == 0) {
return -1;
}
else {
return set.pollFirst();
}
}
}

时间效率一般,空间效率都还行,可见此解法还比较适合此题;

image-20210727111356621

总结

本题是今天的每日一题,难度是为简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。