zoukankan      html  css  js  c++  java
  • 235. Lowest Common Ancestor of a Binary Search Tree

    题目:

    Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______6______
           /              
        ___2__          ___8__
       /              /      
       0      _4       7       9
             /  
             3   5
    

    For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

    链接:  http://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

    一刷,思想是判断当前节点的值

    1.与输入的两值之一相等,查找另一值是否在树里,是则当前值是LCA,否则返回None

    2.当前值在两值中间,查找输入两值是否在树里,都在则返回当前值,否则返回None

    3.当前值比最小值小或比最大值大,更新当前值

    问题,若输入查找的值是None,输出None还是另外一值呢?

     1 class Solution(object):
     2     @staticmethod
     3     def find(root, p):
     4         if not p:
     5             return False
     6         cur = root
     7         while root:
     8             if root.val == p.val:
     9                 return True
    10             if root.val < p.val:
    11                 root = root.right
    12             else:
    13                 root = root.left
    14         return False
    15         
    16     def lowestCommonAncestor(self, root, p, q):
    17         """
    18         :type root: TreeNode
    19         :type p: TreeNode
    20         :type q: TreeNode
    21         :rtype: TreeNode
    22         """
    23         if not root:
    24             return root
    25         if not p or not q:
    26             return None
    27         small = p if p.val < q.val else q
    28         large = p if p.val >= q.val else q
    29 
    30         cur = root
    31         while cur:
    32             if cur.val == small.val:
    33                 return cur if Solution.find(cur, large) else None
    34             if cur.val == large.val:
    35                 return cur if Solution.find(cur, small) else None
    36             if small.val < cur.val < large.val:
    37                 if Solution.find(cur, small) and Solution.find(cur, large):
    38                     return cur
    39                 else:
    40                     return None
    41             cur = cur.right if cur.val < small.val else cur.left
    42         return None

    如果没有找到node可以返回另一个的话,二刷可以试一下recursive解法。

  • 相关阅读:
    RSA加密系统
    安装homebrew
    go helloworld
    下载文件checksum
    6月3日
    6月1日
    5月30日
    5月28日
    5月26日
    5月24日
  • 原文地址:https://www.cnblogs.com/panini/p/5642241.html
Copyright © 2011-2022 走看看