
1. 项目概述今天要和大家分享的是力扣算法训练营第21天的三道题目669修剪二叉搜索树、108将有序数组转换为二叉搜索树和538把二叉搜索树转换为累加树。这三道题都是二叉搜索树BST相关的经典题目涵盖了BST的构建、修改和转换等核心操作。作为算法学习的重要一环二叉搜索树因其高效的查找性能平均O(logn)时间复杂度在实际开发中应用广泛。这三道题从不同角度考察了对BST的理解和操作能力是检验算法基本功的绝佳材料。2. 核心题目解析2.1 力扣669修剪二叉搜索树这道题要求我们修剪BST使得树中所有节点的值都在给定范围[low, high]内。关键在于理解BST的性质左子树所有节点值小于根节点右子树所有节点值大于根节点。递归解法思路如果当前节点值小于low则其左子树所有节点都小于low只需处理右子树如果当前节点值大于high则其右子树所有节点都大于high只需处理左子树否则递归处理左右子树def trimBST(root, low, high): if not root: return None if root.val low: return trimBST(root.right, low, high) if root.val high: return trimBST(root.left, low, high) root.left trimBST(root.left, low, high) root.right trimBST(root.right, low, high) return root2.2 力扣108将有序数组转换为二叉搜索树这道题要求我们将升序数组转换为高度平衡的BST。高度平衡意味着每个节点的左右子树高度差不超过1。二分法递归解法找到数组中间元素作为根节点左边子数组构建左子树右边子数组构建右子树def sortedArrayToBST(nums): def helper(left, right): if left right: return None mid (left right) // 2 root TreeNode(nums[mid]) root.left helper(left, mid-1) root.right helper(mid1, right) return root return helper(0, len(nums)-1)2.3 力扣538把二叉搜索树转换为累加树这道题要求我们将BST转换为累加树使得每个节点的值变成原树中大于或等于该节点值的和。反向中序遍历解法使用反向中序遍历右-根-左维护一个累加变量sum遍历时更新节点值和sumdef convertBST(root): sum 0 def reverseInorder(node): nonlocal sum if not node: return reverseInorder(node.right) sum node.val node.val sum reverseInorder(node.left) reverseInorder(root) return root3. 核心算法技巧详解3.1 递归在BST中的应用递归是处理树结构的天然工具。在BST问题中递归通常有以下特点基线条件节点为空时返回递归条件根据BST性质决定递归方向返回值构建好的子树或处理后的节点注意事项递归深度可能导致栈溢出Python默认递归深度约1000层对于大型树考虑使用迭代法替代递归递归函数的参数传递要明确值传递 vs 引用传递3.2 二分法与BST的关系BST本质上就是维护了二分查找性质的数据结构。将有序数组转换为BST的过程实际上就是二分查找的递归体现中点作为根节点左半部分构建左子树右半部分构建右子树这种构建方式自然保证了树的平衡性。3.3 树的遍历技巧除了常规的前序、中序、后序遍历特定问题需要特殊遍历方式反向中序遍历用于累加树问题层序遍历用于广度优先相关问题Morris遍历O(1)空间复杂度的遍历方法4. 常见问题与解决方案4.1 递归栈溢出问题解决方案使用尾递归优化但Python不支持改为迭代实现使用显式栈模拟递归过程迭代法示例538题def convertBST(root): sum 0 stack [] node root while stack or node: while node: stack.append(node) node node.right node stack.pop() sum node.val node.val sum node node.left return root4.2 边界条件处理常见边界条件空树处理单节点树处理极值处理如最小/最大整数调试技巧打印递归过程中的变量值使用可视化工具观察树结构构造简单测试用例验证边界条件4.3 时间复杂度分析三道题的时间复杂度均为O(n)因为都需要访问每个节点一次669题最坏情况下需要访问所有节点108题每个节点处理一次538题反向中序遍历访问所有节点空间复杂度递归解法O(n)最坏情况下迭代解法O(n)显式栈空间5. 进阶思考与扩展5.1 BST在实际工程中的应用数据库索引B/B树是BST的扩展文件系统目录结构常使用树形结构路由算法决策树等基于树结构的算法5.2 相关题目推荐力扣98验证二叉搜索树力扣450删除二叉搜索树中的节点力扣701二叉搜索树中的插入操作力扣230二叉搜索树中第K小的元素5.3 算法优化方向平衡BST的实现AVL树、红黑树非递归实现各种树操作并行化树遍历算法在实际刷题过程中建议先从递归解法入手理解问题本质再尝试迭代解法提升性能。对于BST问题要时刻牢记其有序性特点这往往是解题的关键突破口。