236. 二叉树的最近公共祖先
思路:
- 找到p、q节点的路径
- 路径中最后一个相同节点就是最近公共祖先的值,如root=3 p=5 q=1,两个路径[3,5] [3,1],公共祖先的值就是【3】
# 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':
# p、q节点路径保存到2个列表中,这两个列表中最后一个相同元素即是最近公共祖先
self.result = [] # 记录所有根节点到叶子节点的路径
self.cur_path = [] # 当前路径
self.traverse(root, p, q)
# 找到两个列表中最后一个相同元素
for i in range(min(len(self.result[0]),len(self.result[1]))):
if self.result[0][i] == self.result[1][i]:
cur_node = self.result[0][i]
else:
break
return cur_node
def traverse(self, cur_node, p, q):
# 遍历二叉树,找到二叉树路径
if not cur_node:
return
self.cur_path.append(cur_node)
if p.val == cur_node.val or q.val == cur_node.val:
self.result.append(self.cur_path[:])
self.traverse(cur_node.left, p, q)
self.traverse(cur_node.right, p, q)
# 往回返的时候要从self.path中拿掉 因为既然回去了 就不能算走过的路径了
self.cur_path.pop()