给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
思路1
直接dfs用list存路径,然后对pq的路径比较即可
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
l = [root]
ll = []
def dfs(root,target):
nonlocal l,ll
if root == target:
ll = l.copy()
return
else:
if root.left:
l.append(root.left)
#print(root.left.val)
dfs(root.left, target)
l.pop()
if root.right:
l.append(root.right)
#print(root.right.val)
dfs(root.right,target)
l.pop()
dfs(root, p)
l1 = ll.copy()
l = [root]
dfs(root, q)
l2 = ll.copy()
ans = None
for i in range(min(len(l1),len(l2))):
#print(l1[i].val,l2[i].val)
if l1[i]==l2[i]:
ans = l1[i]
return ans
思路2
1.p与q,将小的赋值给p,大的赋值给q。
2.只有程序中的三种情况了,分别是:
p.val <= root.val <= q.val(结束,返回root值即结果)、
root.val < p.val < q.val(root.right递归)、
root.val > q.val > p.val(root.left递归)。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
temp = None
if p.val > q.val:
temp = p
p = q
q = temp
if p.val <= root.val <= q.val:
return root
if root.val < p.val < q.val:
return self.lowestCommonAncestor(root.right,p,q)
if root.val > q.val > p.val:
return self.lowestCommonAncestor(root.left,p,q)