描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围:1 ≤n≤1000,树上每个节点的val满足 0≤val≤100
要求:空间复杂度 O(1),时间复杂度 O(n)
注:本题保证二叉树中每个节点的val值均不相同。
如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:
所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。
示例1
输入:
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值:3
代码
# 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
def dfs(root, o1, o2):
if not root:
return None
# 如果不是同一层的,那么在根上第一个出现的就是公共祖先
if root.val == o1 or root.val == o2:
return root
left = dfs(root.left, o1, o2)
right = dfs(root.right, o1, o2)
# 如果不在左边,那么说明o1,o2都在右边
if not left:
return right
# 如果左边存在,但是都不在右边,那么返回左边
if not right:
return left
# 如果在同一层出现的,那么必然left和right都有,那么久返回root(该层的根)就行了
return root
return dfs(root, o1, o2).val