0x00 题目
给定一个根为 root
的二叉树
每个节点的深度
是该节点到根的最短
距离
返回包含
原始树中所有 最深节点
的 最小子树
如果一个节点在 整个树
的任意节点之间具有最大
的深度
则该节点是 最深的
一个节点的 子树
是该节点
加上它的所有后代
的集合
另一个类似的题是:
最深叶节点的最近公共祖先
给你一个有根节点 root
的二叉树
返回它 最深
的叶节点的 最近
公共祖先
叶节点 是二叉树中没有
子节点的节点
树的根节点的 深度 为 0
如果某一节点的深度为 d
它的子节点的深度就是 d+1
如果假定 A
是一组节点 S
的 最近公共祖先
S
中的每个节点都在以 A
为根节点的子树中
且 A
的深度达到此条件下可能的最大
值
0x01 思路
从根节点开始
获得当前节点的左右
子树的最大深度
深度相同
,说明最深的节点在这个节点两边
那这个节点
就是结果
如果深度不相同
,则去深度大
的子树继续判断
最终就能得到结果
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 subtreeWithAllDeepest(_ root: TreeNode?) -> TreeNode? {
guard let r = root else { return nil }
// 求某个节点的最大深度
func maxDep(_ root: TreeNode?) -> Int {
guard let r = root else { return 0 }
return max(maxDep(r.left), maxDep(r.right)) + 1
}
// 左子树深度
let left = maxDep(r.left)
// 右子树深度
let right = maxDep(r.right)
// 深度相同,则当前节点为 最深叶节点的最近公共祖先
if left == right { return r }
// 不相同时,去深度大的子树查找
if left > right {
return subtreeWithAllDeepest(r.left)
}
return subtreeWithAllDeepest(r.right)
}
0x03 我的作品
欢迎体验我的作品之一:小笔记
笔记从未如此简单!
App Store
搜索即可~