news 2026/10/6 23:55:24

DeepSeek LeetCode 236. 二叉树的最近公共祖先 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 236. 二叉树的最近公共祖先 Java实现

LeetCode 236. 二叉树的最近公共祖先 Java 实现

思路:递归后序遍历

从根节点开始递归:

· 如果当前节点为空,或当前节点就是 p 或 q,直接返回当前节点。
· 分别递归左右子树,得到 left 和 right。
· 如果 left 和 right 都非空,说明 p 和 q 分别在左右两侧,当前节点就是最近公共祖先。
· 否则,返回非空的那一个(说明两个目标节点都在同一侧,或只找到了其中一个)。

Java 代码

classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){// 递归终止条件if(root==null||root==p||root==q){returnroot;}// 后序遍历:先处理左右子树TreeNodeleft=lowestCommonAncestor(root.left,p,q);TreeNoderight=lowestCommonAncestor(root.right,p,q);// 左右都找到了,说明 p、q 分布在两侧,当前节点就是 LCAif(left!=null&&right!=null){returnroot;}// 否则返回非空的那一侧returnleft!=null?left:right;}}

复杂度分析

· 时间复杂度:O(n),每个节点最多访问一次。
· 空间复杂度:O(h),递归栈深度为树高。最坏情况下(链状树)为 O(n)。

示例

// 树结构:// 3// / \// 5 1// / \ / \// 6 2 0 8// / \// 7 4p=5,q=1→3p=5,q=4→5p=6,q=4→5

关键点

· 递归函数含义:在以 root 为根的子树中,寻找 p 和 q 的最近公共祖先。
· 如果当前节点就是 p 或 q,直接返回它,因为不可能再往下找到更近的祖先。
· 左右子树返回值都非空,说明两个目标节点分居两侧,当前节点即为答案。
· 只需要一次 DFS,无需额外存储路径。

附:迭代写法(父指针 + 祖先集合)

classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){Map<TreeNode,TreeNode>parent=newHashMap<>();Deque<TreeNode>stack=newArrayDeque<>();parent.put(root,null);stack.push(root);// 遍历整棵树,记录每个节点的父节点while(!parent.containsKey(p)||!parent.containsKey(q)){TreeNodenode=stack.pop();if(node.left!=null){parent.put(node.left,node);stack.push(node.left);}if(node.right!=null){parent.put(node.right,node);stack.push(node.right);}}// 记录 p 到根的所有祖先Set<TreeNode>ancestors=newHashSet<>();while(p!=null){ancestors.add(p);p=parent.get(p);}// 从 q 向上找第一个在 p 祖先集合中的节点while(!ancestors.contains(q)){q=parent.get(q);}returnq;}}

迭代写法时间复杂度 O(n),空间复杂度 O(n),适合不想用递归或树很深的情况。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 23:35:19

74LS181运算器实验全解析:从引脚功能到电路连线的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 23:35:17

自举电容:Buck电路浮地驱动与持续导通的灵魂

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 23:33:18

ROS2 Humble + Gazebo 11 机械臂仿真:从URDF到ros2_control完整配置指南

1. 为什么要在Gazebo里折腾机械臂仿真 如果你正在做机械臂相关的开发&#xff0c;不管是毕业设计、课题研究还是产品预研&#xff0c;大概率会遇到一个很现实的问题&#xff1a;真机太贵、太占地方&#xff0c;而且调试过程中一旦参数写错&#xff0c;轻则撞机重则烧电机。我见…

作者头像 李华
网站建设 2026/10/6 23:31:49

Gerrit+Repo企业级代码协同实战:从零搭建生产可用代码门禁系统

简介&#xff1a;本资源是一份面向Linux系统管理员与DevOps工程师的Git代码协作平台搭建实战指南&#xff0c;聚焦于整合Git、Repo与Gerrit构建企业级代码托管与评审环境。内容覆盖从基础依赖安装&#xff08;Git、OpenSSH、Python setuptools&#xff09;、Gitosis权限管理初始…

作者头像 李华
网站建设 2026/10/6 23:24:00

UE5 Niagara高级特效实战:从龙卷风到Boss战完整制作指南

各位做 UE5 特效的朋友&#xff0c;大家好。Niagara 在虚幻引擎 5 里已经是绝对主力的 VFX 系统&#xff0c;但很多同学刚接触时都有同一个感受&#xff1a;界面看得懂&#xff0c;模块能拖进去&#xff0c;可粒子就是不听话&#xff0c;做不出龙卷风、Boss 战这种有“气势”的…

作者头像 李华