描述
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
注:本题保证二叉树中每个节点的val值均不相同。
# 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 , o1 , o2 ):
return self.dfs(root, o1, o2).val
# write code here
def dfs(self, root, o1 , o2):
if not root:
return root
if root.val == o1 or root.val == o2:
return root
left = self.dfs(root.left, o1 , o2)
right = self.dfs(root.right, o1 , o2)
if not left: return right
if not right: return left
return root
# 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 , o1 , o2 ):
return self.dfs(root,o1, o2).val
# write code here
def dfs(self, root, o1, o2):
if not root:
return root
# 特殊情况,如果o1, o2有一个是根节点,则直接返回根节点
if root.val == o1 or root.val == o2:
return root
# 从根节点的左子树查找最近公共祖先结点
left = self.dfs(root.left, o1 , o2)
# 从根节点的右子树查找最近公共祖先结点
right = self.dfs(root.right, o1 , o2)
# left = self.lowestCommonAncestor(root.left, o1 , o2)
# right = self.lowestCommonAncestor(root.right, o1 , o2)
# 如果左子树递归结果为空,则返回右子树递归结果
if not left: return right
# 反之亦然
if not right: return left
# o1, o2 分别在左右子树中,公共祖先是根节点
return root
"""
if not root:
return None
#若该节点是一个值为o1或者o2的节点,那么该节点是最近公共祖先。
if root.val == o1 or root.val == o2:
return root.val
# #不然递归看它的左右子树有无这个o1 o2
left = self.lowestCommonAncestor(root.right, o1, o2)
right = self.lowestCommonAncestor(root.left, o1, o2)
#会报错
# left = self.lowestCommonAncestor(root.left, o1, o2)
# right = self.lowestCommonAncestor(root.right, o1, o2)
#如果左子树包含,看它的右子树
if left:
if not right: #右子树不包含,公共祖先在左子树
return left
else: #右子树包含,o1 o2左右子树一边一个,公共祖先是根节点
return root.val
else: #如果左子树不包含,则公共祖先在右子树或者该子树不包含o1 o2返回None
return self.lowestCommonAncestor(root.left, o1, o2)
# return root.val
"""