671. 二叉树中第二小的节点 - 力扣(LeetCode)
可以使用深度优先搜索(DFS)来遍历整个二叉树,并寻找第二小的值。
解题思路:
-
理解题意:
-
由于根节点的值等于其两个子节点中的较小值,因此整个树的最小值一定是
root.val
。 -
我们需要在树中找到严格大于
root.val
的最小值,即第二小的值。
-
-
算法步骤:
-
设定
min1 = root.val
(最小值)。 -
进行 DFS 遍历树:
-
如果当前节点的值 大于
min1
,则更新第二小的值。 -
如果当前节点值 等于
min1
,则继续递归遍历其子节点(因为该节点的值不会是我们要找的答案)。
-
-
最终返回找到的第二小值,若未找到,则返回
-1
。
-
代码实现:
from typing import Optional
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def findSecondMinimumValue(root: Optional[TreeNode]) -> int:
min1 = root.val
self.second_min = float('inf')
def dfs(node):
if not node:
return
if min1 < node.val < self.second_min:
self.second_min = node.val
elif node.val == min1:
dfs(node.left)
dfs(node.right)
dfs(root)
return self.second_min if self.second_min < float('inf') else -1
复杂度分析:
-
时间复杂度:O(N),其中 N 是树中的节点数。我们可能需要遍历所有节点一次。
-
空间复杂度:O(H),其中 H 是树的高度,最坏情况下(链状树)递归栈的深度为 O(N),最好情况下(平衡树)为 O(log N)。
这个方法可以有效找到第二小的值,即最接近 root.val
的较大值。