返回

LeetCode 0235:二叉搜索树的最近公共祖先【Python】

见解分享

引言

在计算机科学中,二叉搜索树 (BST) 是广泛应用的数据结构。BST 的特殊性质使得在其中查找、插入和删除元素都非常高效。在 BST 中,一个节点的左子树包含所有小于该节点的值,而右子树包含所有大于该节点的值。

题目概述

给定一个二叉搜索树和其中两个节点,我们的目标是找到这两个节点的最近公共祖先 (LCA)。LCA 是两个节点共有的最近祖先。

Python 解法

def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
    if not root:
        return None
    
    if root.val > p.val and root.val > q.val:
        return self.lowestCommonAncestor(root.left, p, q)
    elif root.val < p.val and root.val < q.val:
        return self.lowestCommonAncestor(root.right, p, q)
    else:
        return root

算法详解

  1. 递归终止条件: 当根节点为空时,直接返回 None。

  2. 判断左右子树: 比较根节点的值与 p 和 q 的值。如果根节点的值大于 p 和 q 的值,则 LCA 在左子树中;如果根节点的值小于 p 和 q 的值,则 LCA 在右子树中;如果根节点的值介于 p 和 q 之间,则根节点就是 LCA。

  3. 递归调用: 根据判断结果,分别递归调用左子树或右子树,直到找到 LCA。

复杂度分析

  • 时间复杂度:O(log n),其中 n 是树中的节点数。因为 BST 的性质,每次递归调用都会将搜索空间减少一半。
  • 空间复杂度:O(log n),递归调用栈的空间占用。

示例

     6
    / \
   2   8
  / \
 0   4
    / \
   3   5

给定 p = 2 和 q = 4,LCA 是 2。

练习题

  • 实现一个函数,给定一个二叉树,返回树的深度。
  • 实现一个函数,给定一个二叉树,判断该树是否为平衡树。