二叉树中第二小的节点
题目描述:
给定一个非空特殊的二叉树,每个结点都是正数,并且每个结点的子结点数量只能为2或0.如果一个结点有两个子结点的话,那么该结点的值等于两个子结点中较小的一个。
更正式地说,root.val = min(root.left.val, root.right.val)总成立。
给出这样的一个二叉树,你需要输出所有结点中第二小的值。如果第二小的值不存在的话,输出-1。
示例1:
输入:root = [2, 2, 5, null, null, 5, 7]
输出:5
解释:最小的值为2,第二小的值为5。
示例2:
输入:root = [2, 2, 2]
输出:-1
解释:最小的值是2,但是不存在第二小的值。
提示:
- 树中结点数目在范围[1, 25]内
- 1 <= Node.val <= 2^31-1
- 对于树中每个结点root.val == min(root.left.val, root.right.val)
思路:
依据题意,根结点的值为所有结点的值中的最小值,左右子结点必有至少一个结点的值与根结点的值相等,由此往下递推,除非不存在根结点或者不存在左右子结点以及所有结点值相等的情况,其他情况下总能找到第二小的结点值。
DFS递归:
python代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findSecondMinimumValue(self, root: TreeNode) -> int:
# dfs递归
res = self.dfs(root)
return res[1] if res[1] != inf else -1
def dfs(self, root):
if not root.left:
return root.val, inf
l1, l2 = self.dfs(root.left)
r1, r2 = self.dfs(root.right)
return ans if len(ans:=sorted(set([l1, l2, r1, r2]))[:2]) == 2 else ans + [inf]