236. 二叉树的最近公共祖先
- 题目链接
- 解题思路:二叉树递归套路。从左儿子收集信息,从右儿子收集信息,然后得到本节点的信息,再返回给自己的父亲节点。
-
- 从儿子收集什么信息?
- 左儿子是否包含p?左儿子是否包含q?右儿子是否包含p?右儿子是否包含q
- 任意一个儿子包含p,那么本节点就包含p,任意一个儿子包含q,那么本节点就包含q
- 如果该节点同时包含p和q那么直接返回结果了(结果放在参数中收集)。
- 有一种特殊情况,就是该节点就是p或者q
-
代码
class Solution: class Info: def __init__(self, has_p, has_q): self.has_p = has_p # 子树上是否包含p self.has_q = has_q # 子树上是否包含q def process(self, head, ans, p, q): if ans[0]: return None if head is None: return self.Info(False, False) has_p = head == p has_q = head == q # 处理左子树 left_info = self.process(head.left, ans, p, q) if left_info is None: # 返回None只有一种可能 就是已经找到答案了 就是ans return None has_p = has_p or left_info.has_p # 如果左子树上有了 那么以当前节点为头的子树也有了 has_q = has_q or left_info.has_q # 处理右子树 right_info = self.process(head.right, ans, p, q) if right_info is None: return None has_p = has_p or right_info.has_p has_q = has_q or right_info.has_q if has_p and has_q: ans[0] = head return None return self.Info(has_p, has_q) def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': ans = [None] self.process(root, ans, p, q) return ans[0]
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理