# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param root TreeNode类
# @param p int整型
# @param q int整型
# @return int整型
#
class Solution:
# 通用解法 不需要二叉搜索树
def DFS(self, root, node:int, path: list):
if not root:
return
path.append(root.val)
# 相等直接结束
if path[-1] == node: return
# 完全不需要 判断是不是叶子结点 并且叶子结点是否等于node
# if not root.left and not root.right and root.val != node:
# path.pop()
# return
# 不相等接着遍历
self.DFS(root.left, node, path)
self.DFS(root.right, node, path)
# 当前结点不等于node 其儿子结点也不等于就pop
# 有一个等于就进入上一层循环了
if path[-1] != node:
path.pop()
return
# 二叉搜索树
def get_path(self, root, target):
path = []
node = root
while node.val != target:
path.append(node.val)
if node.val < target:
node = node.right
else:
node = node.left
# 保存找到的那一个
path.append(node.val)
return path
def lowestCommonAncestor(self , root: TreeNode, p: int, q: int) -> int:
# write code here
p_path, q_path = self.get_path(root, p) ,self.get_path(root, q)
# 遍历2个路径表 不要用for 容易越界
i = 0
while i < len(q_path) and i < len(p_path):
if p_path[i] == q_path[i]:
res = p_path[i]
i += 1
else:
break
return res