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 我的小作品
欢迎体验我的作品之一:小笔记-XNote
告别机械式的 复制、粘贴、复制、粘贴......
让笔记一步到位!
App Store 搜索即可~