1. 二叉搜索树基础与三大经典操作解析
二叉搜索树(Binary Search Tree, BST)作为数据结构领域的常青树,在算法面试和实际工程中都有着广泛应用。今天我将结合多年刷题和项目经验,深度剖析BST的三大经典操作:修剪、构建和累加转换。这些操作不仅是面试高频考点,更是理解树形结构递归本质的绝佳范例。
BST的核心特性在于:对于任意节点,其左子树所有节点值小于该节点值,右子树所有节点值大于该节点值。这个看似简单的性质,却衍生出许多精妙的算法。我们先看第一个操作——范围修剪。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 修剪二叉搜索树:优雅的递归剪枝术
2.1 问题定义与递归思路
给定BST的根节点和区间[low, high],要求修剪树中所有不在此区间的节点,同时保持BST性质。例如输入:
code复制 3
/ \
0 4
\
2
/
1
low = 1, high = 3,修剪后应得到:
code复制 3
/
2
/
1
2.2 递归解法精析
python复制class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
def trim(root):
if not root:
return None
if root.val < low:
return trim(root.right) # 当前值太小,保留右子树(更大的值)
if root.val > high:
return trim(root.left) # 当前值太大,保留左子树(更小的值)
root.left = trim(root.left) # 当前值在范围内,递归处理左右子树
root.right = trim(root.right)
return root
return trim(root)
关键点解析:
- 剪枝策略:当节点值小于low,其左子树必然全部无效,只需处理右子树;反之亦然
- 递归终止:遇到空节点直接返回,这是所有树递归的基准情况
- 连接处理:有效节点需要递归处理其左右子树并重新连接
实战经验:在工业级代码中,建议添加参数合法性检查(如low <= high),并考虑添加日志记录修剪前后的树结构,便于调试。
2.3 迭代解法对比
递归虽优雅,但存在栈溢出风险。迭代解法使用栈模拟递归:
python复制def trimBST_iterative(root, low, high):
# 先找到新的根节点
