865 具有所有最深节点的最小子树
题目:
给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。
返回包含原始树中所有 最深节点 的 最小子树 。
如果一个节点在 整个树 的任意节点之间具有最大的深度,则该节点是 最深的 。
一个节点的 子树 是该节点加上它的所有后代的集合。
分析:
该问题就是求所有叶子节点的最近公共祖先。
定义函数 find 寻找每个节点的深度和最近公共祖先。如果深度相等,说明左右子树中都有最深的叶子节点,那么当前节点就是所有叶子节点的最近公共祖先。
如果左子树深度大,那么返回左子树结果。
// date 2023/10/28
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func subtreeWithAllDeepest(root *TreeNode) *TreeNode {
// 问题就是 求所有叶子节点的最近公共祖先
_, res := find(root)
return res
}
// 求 子树的深度 和 子树叶子节点的最近公共祖先
func find(root *TreeNode) (int, *TreeNode) {
if root == nil {
return 0, nil
}
ld, ln := find(root.Left)
rd, rn := find(root.Right)
if ld > rd {
return ld+1, ln
}
if ld < rd {
return rd+1, rn
}
return ld+1, root
}
最后更新于