236. 二叉树的最近公共祖先

该文章描述了一种使用递归方法在二叉树中寻找两个给定点(p和q)的最低公共祖先(LCA)的算法。在遍历过程中,节点的左右孩子分别传递p/q和None,直到到达最近祖先,然后返回该祖先节点。如果左右子树都为空,返回None;若只有一侧非空,则返回非空一侧;否则返回当前节点作为最近祖先。
摘要由CSDN通过智能技术生成

2023.6.15
关键不在于递归的终止条件,而在于递归的单步逻辑
当到达最近祖先之前,左右孩子向中传递一边传递的是p/q另一边传递的是None,当到达最近祖先时,此节点左孩子传的是p/q,右孩子传的是q/p,此时此节点向上返回的是自己的最近祖先root,再之后节点左右孩子一边返还祖先root一边返还None,此时节点向上返还祖先root

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        self.p = p
        self.q = q
        return self.composeporq(root)
    
    def composeporq(self, root):
        if root == self.p:
            return root
        
        if root == self.q:
            return root
        
        if root == None:
            return None
        
        ifleft = self.composeporq(root.left)
        ifright = self.composeporq(root.right)

        if ifleft == None and ifright == None:
            return None
        
        elif ifleft != None and ifright == None: # 单边
            return ifleft

        elif ifright != None and ifleft == None:
            return ifright
        
        else: return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值