【二叉树】二叉树中第二小的节点
原创
©著作权归作者所有:来自51CTO博客作者haocold的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
}
小编辑器
小而巧