返回

你在刷LeetCode吗?这道题你会吗?

IOS

一、题目

给你一个二叉树,请你找出其中两个指定节点的最近公共祖先。

最近公共祖先是两个节点向上的路径中最深的那个节点。

例如,对于下面的二叉树,节点 8 和 11 的最近公共祖先是 3。

              3
            / \
           5   1
          / \   \
         6   2   7
              / \
             8   11

示例 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 。因为根据定义最近公共祖先节点是两个节点向上的路径中最深的那个节点。

示例 3:

输入:root = [1,2,3], p = 2, q = 3
输出:1
解释:节点 2 和节点 3 的最近公共祖先是节点 1 。

二、思路分析

解决这道题,我们可以使用递归算法。我们可以从根节点开始递归地搜索二叉树,分别找到p和q所在的子树。如果p和q都在根节点的左子树中,那么根节点就是它们的最近公共祖先。如果p和q都在根节点的右子树中,那么根节点也是它们的最近公共祖先。如果p和q分别在根节点的左右子树中,那么根节点就是它们的最近公共祖先。

三、AC代码

def lowestCommonAncestor(root, p, q):
    if root is None or root == p or root == q:
        return root

    left = lowestCommonAncestor(root.left, p, q)
    right = lowestCommonAncestor(root.right, p, q)

    if left and right:
        return root
    elif left:
        return left
    else:
        return right

四、参考学习网址

LeetCode 236. 二叉树的最近公共祖先

总结

通过这篇文章,你已经学习到了如何使用递归算法来解决LeetCode 236号问题:二叉树的最近公共祖先。如果你想提高自己的编程能力,那么LeetCode是一个非常好的平台。它提供了大量的题目供你练习,并且有详细的题解供你参考。希望这篇文章对你有帮助,也希望你能够在LeetCode上取得好成绩!