1123 最深叶节点的最近公共祖先(dfs)
发布日期:2021-05-07 21:53:38 浏览次数:23 分类:技术文章

本文共 1259 字,大约阅读时间需要 4 分钟。

1. 问题描述:

给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先。

回想一下:

叶节点是二叉树中没有子节点的节点

树的根节点的深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1
如果我们假定 A 是一组节点 S 的 最近公共祖先,S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。

示例 1:

输入:root = [1,2,3]

输出:[1,2,3]
解释: 
最深的叶子是值为 2 和 3 的节点。
这些叶子的最近共同祖先是值为 1 的节点。
返回的答案为序列化的 TreeNode 对象(不是数组)"[1,2,3]" 。

示例 2:

输入:root = [1,2,3,4]

输出:[4]

示例 3:

输入:root = [1,2,3,4,5]

输出:[2,4,5]

提示:

  • 给你的树中将有 1 到 1000 个节点。
  • 树中每个节点的值都在 1 到 1000 之间。

2. 思路分析:

① 首先需要理解清楚题目,这道题目类似于求解左右子树的深度,因为是关于树的问题,我们知道树的大部分问题都是可以使用递归来进行求解的,对于这道题目来说也是如此,因为是要求解出公共祖先,也就是左右子树最大深度对应的根节点,所以我们可以在递归完左右子树之后对其进行处理,可以写一个有返回值的dfs方法,方法返回的一个参数是当前节点的深度,这样我们在递归完左右子树之后就可以根据左右子树的深度来确定返回的是哪一个节点,假如左子树高那么返回左子树,右子树高那么右子树,一样高返回的是根节点

② 在递归完左右子树进行处理有点像后序遍历,我们知道当我们递归完左右子树之后当前这一层的节点那么就是左右子树的根节点,而题目恰恰是求解的是最大深度的公共祖先,所以与后序遍历的处理方法是一样的,在dfs方法中可以返回多个值,对于这道题目来说可以返回两个值,一个是当前节点最大深度的公共祖先,另外一个是当前节点最大深度的公共祖先的深度

3. 代码如下:

class Solution:    def lcaDeepestLeaves(self, root: TreeNode) -> TreeNode:        def dfs(root):            if not root: return None, 0            lr, ld = dfs(root.left)            rr, rd = dfs(root.right)            if ld > rd:                 return lr, ld + 1            elif ld < rd:                return rr, rd + 1            else:                return root, ld + 1        res, h = dfs(root)        return res

 

上一篇:279 完全平方数(dfs)
下一篇:python中的循环语句

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月16日 04时20分16秒