返回

力扣解题利器:掌握二叉搜索树最近公共祖先的奥秘

前端

前言:

力扣(LeetCode)作为程序员试金石,以其海量的题目和专业的评测体系备受推崇。其中,二叉搜索树的最近公共祖先(LCA)问题以其经典性和实用性,成为众多程序员的必经之路。本文将深入浅出地解析这道题目的解题思路和实现技巧,助你轻松通关。

什么是二叉搜索树的最近公共祖先?

在二叉搜索树(BST)中,对于任意两个节点 p 和 q,其最近公共祖先(LCA)是这两个节点的公共祖先中,深度最大的那个节点。

解题思路

解决这道题目,我们可以采用分治的思想,自顶向下地递归遍历 BST。具体步骤如下:

  1. 递归终止条件:

    • 若当前节点为空,则表明未找到公共祖先,返回 null。
    • 若当前节点等于 p 或 q,则表明当前节点为最近公共祖先,直接返回当前节点。
  2. 递归过程:

    • 若当前节点的值大于 p 和 q 的值,则最近公共祖先一定在左子树中,递归遍历左子树。
    • 若当前节点的值小于 p 和 q 的值,则最近公共祖先一定在右子树中,递归遍历右子树。
    • 若当前节点的值介于 p 和 q 的值之间,则表明当前节点就是最近公共祖先,直接返回当前节点。

实现代码

def lowest_common_ancestor(root, p, q):
    if not root:
        return None
    if root == p or root == q:
        return root

    if root.val > p.val and root.val > q.val:
        return lowest_common_ancestor(root.left, p, q)
    elif root.val < p.val and root.val < q.val:
        return lowest_common_ancestor(root.right, p, q)
    else:
        return root

性能分析

该算法的时间复杂度为 O(h),其中 h 为 BST 的高度。在最坏的情况下(BST 退化为链表),h 等于节点数 n,此时算法的时间复杂度为 O(n)。在平均情况下,h 约为 log(n),此时算法的时间复杂度为 O(log(n))。

适用场景

该算法广泛应用于各种需要求解二叉搜索树中节点最近公共祖先的场景,如:

  • 求解两节点之间的距离。
  • 判断两个节点是否在同一子树中。
  • 判断一棵二叉树是否为二叉搜索树。

总结

通过本文的深入剖析,相信大家已经对二叉搜索树的最近公共祖先问题有了透彻的理解。掌握了这道经典题目的解题方法,将为各位力扣征程添砖加瓦。代码的力量在于实践,愿各位通过不断刷题磨砺自身,在算法和数据结构的海洋中乘风破浪。