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

原文地址:https://www.cnblogs.com/NPC-assange/p/9684514.html