zoukankan      html  css  js  c++  java
  • LeetCode--235--二叉树的最近公共祖先

    问题描述:

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

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

    例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

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

    示例 1:

    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
    输出: 6 
    解释: 节点 2 和节点 8 的最近公共祖先是 6。
    

    示例 2:

    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
    输出: 2
    解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

    说明:

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

    由于是二叉搜索树,找到 p.val <= root.val <= q.val return root

    方法1:

     1 class Solution(object):
     2     def lowestCommonAncestor(self, root, p, q):
     3         """
     4         :type root: TreeNode
     5         :type p: TreeNode
     6         :type q: TreeNode
     7         :rtype: TreeNode
     8         """
     9         if root == None:
    10             return None
    11         min_ = min(p.val,q.val)
    12         max_ = max(p.val,q.val)
    13         if min_<= root.val <= max_:
    14             return root
    15         else:
    16             l = self.lowestCommonAncestor(root.left,p,q)
    17             r = self.lowestCommonAncestor(root.right,p,q)
    18         if not l :
    19             return r
    20         if not r : 
    21             return l

    改:

     1 class Solution(object):
     2     def lowestCommonAncestor(self, root, p, q):
     3         """
     4         :type root: TreeNode
     5         :type p: TreeNode
     6         :type q: TreeNode
     7         :rtype: TreeNode
     8         """
     9         while root:
    10             if p.val < root.val > q.val:
    11                 root = root.left
    12             elif p.val > root.val < q.val:
    13                 root = root.right
    14             else:
    15                 return root

    方法2:(官方)

     1 class Solution(object):
     2     def search(self, root, x, stack):
     3         stack.append(root)
     4         if x.val < root.val:
     5             self.search(root.left, x, stack) # 一定存在
     6         elif root.val < x.val:
     7             self.search(root.right, x, stack)
     8         else:
     9             return
    10     def lowestCommonAncestor(self, root, p, q):
    11         """
    12         :type root: TreeNode
    13         :type p: TreeNode
    14         :type q: TreeNode
    15         :rtype: TreeNode
    16         """
    17         s_p, s_q = [], []
    18         self.search(root, p, s_p)
    19         self.search(root, q, s_q)
    20         n = min(len(s_q), len(s_p))
    21         for i in range(n):
    22             if s_p[i] != s_q[i]:
    23                 return s_q[i - 1]
    24         return s_q[n-1]

    2018-09-21 06:56:21

  • 相关阅读:
    NoSuchMethodError 一般是jar包冲突了
    联通网络环境上无法访问http://repo1.maven.org/maven2/中央库解决,镜像库添加
    实现MySQL数据库的实时备份
    海外支付:遍布全球的Paypal
    .Net分布式缓存应用实例:Couchbase
    海外支付:抵御信用卡欺诈的CyberSource
    那些年,我们开发的接口之:QQ登录(OAuth2.0)
    ES6知识整理(一)--- let/const/箭头函数
    webpack 热更新(实施同步刷新)
    Vue状态管理vuex
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/9684514.html
Copyright © 2011-2022 走看看