二叉树——16.二叉树的最近公共祖先

力扣题目链接

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

解题思路总结

  1. 递归处理:问题的核心在于使用递归遍历二叉树,从叶子节点开始,逐层向上回溯,寻找 pq 的位置。
  2. 终止条件:当找到节点 pq,或者遍历到空节点时,终止当前递归。
  3. 返回条件
    • 如果在左右子树分别找到了 pq,说明当前节点是最近公共祖先。
    • 如果只在一侧找到 pq,返回找到的那个节点。
    • 如果两侧都没有找到,返回 None

通过这种递归的方式,算法能够高效地找到二叉树中两个节点的最近公共祖先。

完整代码如下:

class Solution:
    def lowestCommonAncestor(self, root, p, q):
        if root == q or root == p or root is None:
            return root

        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)

        if left is not None and right is not None:
            return root

        if left is None and right is not None:
            return right
        elif left is not None and right is None:
            return left
        else: 
            return None
        if root == q or root == p or root is None:
            return root

这部分是递归的终止条件。当当前节点 root 等于 pq 或者 root 为空时,直接返回当前节点。这意味着一旦找到 pq,就返回该节点;如果遍历到空节点,则返回 None

        left = self.lowestCommonAncestor(root.left, p, q)
        right = self.lowestCommonAncestor(root.right, p, q)

这里的两行代码是递归地在左右子树中寻找 pqleft 存储的是在左子树中找到的结果,right 存储的是在右子树中找到的结果。

        if left is not None and right is not None:
            return root

如果在左右子树中分别找到了 pq,那么当前节点 root 就是 pq 的最近公共祖先,因此返回当前节点。

        if left is None and right is not None:
            return right
        elif left is not None and right is None:
            return left
        else: 
            return None

这部分代码处理了另外几种情况:

  1. 如果 left 为空而 right 不为空,说明 pq 都在右子树中,因此返回 right
  2. 如果 right 为空而 left 不为空,说明 pq 都在左子树中,因此返回 left
  3. 如果 leftright 都为空,说明在当前子树中没有找到 pq,返回 None
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值