1. 二叉搜索树基础回顾
在深入探讨这三道LeetCode题目之前,我们先快速回顾一下二叉搜索树(BST)的核心特性。BST是一种特殊的二叉树,其中每个节点的值都大于其左子树中所有节点的值,且小于其右子树中所有节点的值。这个性质使得BST在查找、插入和删除操作上具有对数级的时间复杂度(O(log n)),前提是树保持相对平衡。
BST的三大基本操作:
- 查找:从根节点开始,比较目标值与当前节点值,决定向左或向右子树移动
- 插入:类似查找过程,直到找到一个空位置插入新节点
- 删除:最复杂的操作,需要考虑被删除节点的子节点情况
理解这些基础对解决今天的三道题目至关重要,因为它们都是这些基本操作的变种或组合。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 235. 二叉搜索树的最近公共祖先
2.1 问题理解与思路分析
最近公共祖先(LCA)问题要求我们找到二叉搜索树中两个节点的最低共同祖先节点。与普通二叉树不同,BST的有序性为我们提供了更高效的解决方案。
关键观察点:
- 如果p和q的值都小于当前节点值,它们的LCA必定在左子树
- 如果p和q的值都大于当前节点值,它们的LCA必定在右子树
- 如果当前节点值位于p和q的值之间(或等于其中之一),当前节点就是LCA
这个性质允许我们实现一个时间复杂度为O(h)的算法,其中h是树的高度。
2.2 代码实现与优化
python复制# 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':
curr = root
while curr:
if curr.val > p.val and curr.val > q.val:
curr = curr.left
elif curr.val < p.val and curr.val < q.val:
curr = curr.right
else:
return curr
注意:在实际编码时,确保处理p或q本身就是LCA的情况。上述代码已经包含了这种情况,因为当curr等于p或q时,自然会返回curr。
2.3 边界条件与测试案例
需要考虑的特殊情况:
- 树为空
- p或q为None
- p或q不在树中
- p和q是同一个节点
- p是q的祖先或反之
虽然题目假设p和q都存在于树中,但在实际面试中,最好与面试官确认这些边界条件。
3. 701. 二叉搜索树中的插入操作
3.1 问题理解与插入策略
BST的插入操作相对简单,核心思想是找到合适的位置插入新节点,同时保持BST的性质。插入的位置总是在叶子节点或某个空子节点处。
插入算法的基本步骤:
- 如果树为空,新节点成为根节点
