题解 | #在二叉树中找到两个节点的最近公共祖先#
在二叉树中找到两个节点的最近公共祖先
https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116
from sys import flags
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param root TreeNode类
# @param o1 int整型
# @param o2 int整型
# @return int整型
#
class Solution:
def lowestCommonAncestor(self , root: TreeNode, o1: int, o2: int) -> int:
# write code here
if root == None:
return None
path1 = []
path2 = []
self.dfs(root,path1,o1)
# 这里要注意重置一下标志
self.flag = False
self.dfs(root,path2,o2)
# 从两个path中查找第一个相同节点
# 注意,如果他们有相同的祖先,那么从前往后的路径一定是一样的
i=0
res = None
while i < len(path1) and i<len(path2):
if path1[i]==path2[i]:
# 最后一个相同的节点就是最近的共同祖先,加一要放在后面
res = path1[i]
i+=1
else:
break
return res
flag = False
def dfs(self,root:TreeNode,path:list,m:int):
if root == None:
return
path.append(root.val)
# 查找判断是否有相同节点,找到就可以提前退出了
# 这里设置一个标志,用于后面判断是否要返回路径
if root.val==m:
self.flag = True
return
self.dfs(root.left,path,m)
self.dfs(root.right,path,m)
# 如果存在一条这样的路径就返回
if self.flag:
# 这里可以不用return path 因为传入的参数是随函数变化的
return
# 否则就弹出,然后从父节点继续寻找
# 这个回调很重要
path.pop()
剑指offer刷题笔记 文章被收录于专栏
24秋招剑指offer刷题的笔记

