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

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

二叉树是没有排序的,而且树的形状也没要求,那么递归
1
递归就是分析多种情况,然后不断递归调用

class Solution:
    def lowestCommonAncestor(self,root,p,q):
        if not root or root==p or root==q: #root为空,或者是p和q中的一个值,那么都返回root
            return root
        left=self.lowestCommonAncestor(root.left,p,q)#root判断完了,开始不断递归其左子树和右子树,判断其子树的信息
        right=self.lowestCommonAncestor(root.right,p,q)#这两步是不断递推得到左右子树的信息,子树不含,包含一个,都含pq,下面三个条件就是判断
        if not left and not right:#如果左子树和右子树都为空,则返回空,不含pq
            return
        elif left and right:#如果左子树和右子树都不为空,表面p和q在两个子树里,那么公共节点就是root,都含pq
            return root
        else:#如果左右子树有一个为空,说明另一个不为空,p和q在那一个子树里,则返回继续递归
            return right if not left else left

参考链接
时间空间复杂度O(n)

235. 二叉搜索树的最近公共祖先

二叉搜索树是排好序的,所以直接判断root和p,q的值的大小即可
1

class Solution:
    def lowestCommonAncestor(self,root,p,q):
        if not root or root==p or root==q:
            return root
        if root.val>p.val and root.val>q.val:  #root值大,说明p,q在root的左子树里,那么继续遍历左子树
            return self.lowestCommonAncestor(root.left,p,q)
        if root.val<p.val and root.val<q.val:
            return self.lowestCommonAncestor(root.right,p,q)#root值小,说明p,q都在右子树
        else:
            return root

一个是判断值存不存在,一个是判断值的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值