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

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

二叉树是没有排序的,而且树的形状也没要求,那么递归
235. 二叉搜索树的最近公共祖先 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的值的大小即可
235. 二叉搜索树的最近公共祖先 236. 二叉树的最近公共祖先_第2张图片

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

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

你可能感兴趣的:(数据结构-二叉搜索树)