
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
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月16日 04时20分16秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
2019-03-05
Mybatis【7】-- Mybatis如何知道增删改是否成功执行?
2019-03-05
Mybatis【9】-- Mybatis占位符#{}和拼接符${}有什么区别?
2019-03-05
计算输入的一句英文语句中单词数
2019-03-05
zabbix系列之十——添加短信告警
2019-03-05
docker复制文件到宿主机
2019-03-05
lvs+keepalive构建高可用集群
2019-03-05
Mysql高可用架构(主从同步)
2019-03-05
mysql主从延迟高的原因
2019-03-05
ATS缓存数据结构
2019-03-05
glob模块
2019-03-05
6 个 Linux 运维典型问题
2019-03-05
oracle无法启动asm实例记录
2019-03-05
取消vim打开文件全是黄色方法
2019-03-05
YAML基础教程
2019-03-05
一个系统部署多个tomcat实例
2019-03-05
HP服务器设置iLO
2019-03-05
Redhat 平台下LVM管理说明
2019-03-05
oracle数据库迁移
2019-03-05