我的思路:先分别求出p结点到根节点的路径和q结点到根结点的路径,然后找到最近的公共祖先。
其中,如何求得p结点到根结点的路径,需要好好复习一下。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.path=[]
self.flag=0
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
pr=qr=root
self.qianxu(pr,p)
p_path=self.path
self.path=[]
self.flag=0
self.qianxu(qr,q)
q_path=self.path
print(p_path)
print(q_path)
for i in range(0,min(len(p_path),len(q_path))):
if p_path[i]==q_path[i]:
result=p_path[i]
if i==min(len(p_path),len(q_path))-1:
return result
else:
return result
def qianxu(self,root,p):
if self.flag==1:
return
if root==None:
return
self.path.append(root)
if root==p:
self.flag=1
self.qianxu(root.left,p)
self.qianxu(root.right,p)
if self.flag==0:
self.path.pop()
当然,这样的思想并不是最优的。
更好的思路:
class Solution:
def lowestCommonAncestor(self, root, p, q):
"""
注意p,q必然存在树内, 且所有节点的值唯一!!!
递归思想, 对以root为根的(子)树进行查找p和q, 如果root == null || p || q 直接返回root
表示对于当前树的查找已经完毕, 否则对左右子树进行查找, 根据左右子树的返回值判断:
1. 左右子树的返回值都不为null, 由于值唯一左右子树的返回值就是p和q, 此时root为LCA
2. 如果左右子树返回值只有一个不为null, 说明只有p和q存在与左或右子树中, 最先找到的那个节点为LCA
3. 左右子树返回值均为null, p和q均不在树中, 返回null
"""
if not root or root==p or root ==q:
return root
left=self.lowestCommonAncestor(root.left,p,q)
right=self.lowestCommonAncestor(root.right,p,q)
if left and right :
return root
if not left:
return right
else:
return left