问题描述:
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 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