题目内容
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
题目内容
首先根据这道题目来说,我们的节点是一定存在于这棵树之中的,而且是惟一的。这是两个非常强的约束条件。对于一棵树来说,面对这两个节点,有四种情况。分别是包含两个节点,包含Q,包含P和全都不包含。那么我们根据这4种情况来递归构建函数。
程序代码
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
return self.dfs(root,p,q)
def dfs(self,root,p,q):
if not root:
return False
if root==p or root==q:
return root
left=self.dfs(root.left,p,q)
right=self.dfs(root.right,p,q)
if left and right:
return root
if left:
return left
if right:
return right
else:
return False