一枚菜鸟的leetcode刷题笔记 - Day15

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

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

本题的解法完全参考了 利用二叉搜索树的性质,一次递归

二叉搜索树具有如下性质:

  1. 若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。
  2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。
  3. 任意结点的左、右子树也分别为二叉搜索树。
  • 假如要找的值都在二叉搜索树根节点的左侧,那么因为二叉搜索树的性质,要找的值必然在它的左子树中
  • 假如要找的值都在二叉搜索树根节点的右侧,那么因为二叉搜索树的性质,要找的值必然在它的右子树中

因此,我们可以得到求解的思路,假如 p 和 q 都小于根节点的值,那么遍历左子树,假如 p 和 q 都大于根节点的值,就遍历右子树,其余的任何情况下,直接返回根节点,就是我们要的答案。

迭代写法

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return None
        while root:
            if p.val > root.val and q.val > root.val:
                root = root.right
            elif p.val < root.val and q.val < root.val:
                root = root.left
            else:
                return root

递归写法

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if not root:
            return None
        if p.val > root.val and q.val > root.val:
            return self.lowestCommonAncestor(root.right, p, q)
        elif p.val < root.val and q.val < root.val:
            return self.lowestCommonAncestor(root.left, p, q)
        return root

231 - 2的幂

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        for i in range(32):
            mask = 1 << i   #返回的是2^i
            if n ^ mask == 0:
                return True
        return False

这道题目一看是求2的幂我就想到位异或。选择一个较大的数 n u m m a x num_{max} nummax作为范围,即我们的方法适用的数据范围 < 2 n u m m a x < 2^{num_{max}} <2nummax. 相当于不断拿n去和2的直到 n u m m a x num_{max} nummax幂为模板去比较。

注意:<< 是python的运算符,通过从右侧推入零来向左移动,推掉最左边的位(Zero fill left shift)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSwKXPRz-1611755829000)(media/16104455646898/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202021-01-26%20%E4%B8%8B%E5%8D%8822.57.14%20%E4%B8%8B%E5%8D%88.png)]

class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n == 0:
            return False
        return n & (n-1) == 0

位运算:求解2的幂
这个解法很简单,找到规律后非常容易实现。

对于N为2的幂的数,都有 N & (N-1)=0,所以这就是我们的判断条件。

把 0 单独拿出来讨论是因为0 & (0-1) = 0,但 0 不是 2的幂。

你可能感兴趣的:(leetcode,算法,二叉树,数据结构,python)