时间:2020-05-31
题目地址:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
题目难度:Medium
题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
思路1:如果root = p or q,说明p q有一个在根节点上,返回root即可;否则在root的左子树寻找,如果左子树中存在,右子树不存在,则返回该节点;反之亦然;如果左右子树都存在返回root即可
代码段1:通过
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if(root == None or root == p or root == q):
return root
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if(left == None):
return right
elif(right == None):
return left
else:
return root
总结:
- 算法理解对了,代码书写就看你的代码功底了,还是得多练
- 下边的优化版本略快
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if root in (None, p, q): return root left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) return right if left == None else left if right == None else root
- 直接写出来代码一了,考虑出了每个结点应该干啥,同时任何递归的灵魂三问 【2021-02-06】
a、这个函数是干嘛的? 输入及输出,考虑所有情况
b、这个函数参数中的变量是什么的是什么? 状态转移,以root为根到以root的子节点为根
c、得到函数的递归结果,你应该干什么?
4. 题目说了是二叉树里边的两个结点,否则需要考虑左右都不存在时
if left == None and right == None:
return None