剑指offer68:二叉树的最近公共祖先 python

本文深入探讨了剑指Offer68题中的二叉树最近公共祖先问题,提供了详细的解题思路和Python实现代码。通过递归方法,明确了当p和q分别位于node的左右子树或一方为另一方的子节点时,node即为最近公共祖先。文章附带的代码示例清晰易懂,有助于读者理解和掌握这一经典算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer68:二叉树的最近公共祖先 python

题目描述

在这里插入图片描述

解法

首先思考该问题时候要确定什么时候该node是p和q的最近公共祖先(如果要求所有公共祖先的话,那么最近公共祖先的所有祖先都应该在这个列表中。)

  1. p和q分别位于node的左子树和右子树上

  2. p位于q的左子树或者右子树上(反之亦然)

这时,我们可以采用递归的方法:

class Solution:
    def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
        if not root or root==p or root==q:
            return root
        left = self.lowestCommonAncestor(root.left,p,q)
        right = self.lowestCommonAncestor(root.right,p,q)
        if not left: return right  #如果left为空,那么则返回right节点上的点,right会指向p或q或者两者的公共祖先
        elif not right: return left #同上
        elif not left and not right: return None #如果都为空,那么说明这棵树上没有这俩节点
        else: return root  #如果都不为空,说明该节点就是最近祖先

思考感想

🤔🤔🤔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值