二叉树的最近公共祖先

问题

这道题去年刷过,但是今年来做又没写对,写篇文章从头到尾梳理下思路,强化下记忆。(愿佛祖保佑信女,面试遇到此题时可以信手拈来。。。。

在这里插入图片描述

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

分析

最近公共祖先(Lowest Common Ancestor: LCA)的位置有两种情况:

  1. LCA就存在于p、q之中;
  2. LCA不存在于p、q之中
    在这里插入图片描述

给了root, p,q,首先badcase判断一下root 是不是等于p或者q,如果是的话,不用再找了,LCA必定就是root了,对应上图的场景二。

如果不等于就麻烦点了。因为题目说了嘛,所有的元素不会重复,那我们取左子树和右子树分别去找找p和q,这个时候又分三种场景:

  1. p, q都在左子树中;
  2. p, q都在右子树中;
  3. p, q一个在左子树中,一个在右子树中:那就是对应上图的场景一了。

Python实现

def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode:
    if not root or root.val == p.val or root.val == q.val:
        return root
    left = self.lowestCommonAncestor(root.left, p, q)
    right = self.lowestCommonAncestor(root.right, p, q)
    if left and right:
        return root
    else:
        if left:
            return left
        if right:
            return right

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值