0x00 题目
给定一个非空特殊的二叉树,每个节点都是 正数
并且每个节点的子节点数量只能为 2 或 0
如果一个节点有两个子节点的话
那么该节点的值等于两个子节点中 较小 的一个
更正式地说,
root.val = min(root.left.val, root.right.val) 总成立
给出这样的一个二叉树,你需要输出所有节点中的 第二小 的值
如果第二小的值不存在的话,输出 -1
0x01 思路
一个结点如果存在子树,左右子树
要么值相等,要么不相等
若相等:分别递归左右子树
不相等:在当前树中,较小的值和节点的值一样,
第二小的必然是 更大 的那个
所以我们将返回结果 res 设置为该较大的值
因为【较大的值】在他的子树中一定是【最小的值】了(根据上面的公式)
所以对较小值的树进行递归查找,是否会有更小的第二小的值
0x02 解法
语言:Swift
树节点:TreeNode
public class TreeNode {
public var val: Int
public var left: TreeNode?
public var right: TreeNode?
public init() { self.val = 0; self.left = nil; self.right = nil; }
public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
self.val = val
self.left = left
self.right = right
}
}
解法:
func findSecondMinimumValue(_ root: TreeNode?) -> Int {
// 不存在时,返回 -1
var res = -1
func find(_ root: TreeNode?) -> Int {
if root == nil { return res }
if let left = root?.left,
let right = root?.right {
// 值不相等时
if left.val != right.val {
// 保存较大值
let big = max(left.val, right.val)
res = (res == -1)? big : min(res,big)
// 递归较小的树,看看有没有更小的
find(left.val > right.val ? right : left)
}else{
// 值相等时,递归左右子树
find(root?.left)
find(root?.right)
}
}
return res
}
find(root)
return res
}
0x03 我的小作品
欢迎体验我的作品之一:小编辑器-XCompiler
在线编辑器,包含多种语言~
App Store 搜索即可~