387 字
2 分钟
代码随想录算法训练营第十八天 | 二叉树 Part08

669. 修剪二叉搜索树#

LeetCode 669. 修剪二叉搜索树

class Solution:
# 利用 BST 的性质剪枝,递归判断当前节点是否保留,并修剪左右子树
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return None
if root.val < low:
# 当前节点值小于区间下限,只保留右子树
return self.trimBST(root.right, low, high)
if root.val > high:
# 当前节点值大于区间上限,只保留左子树
return self.trimBST(root.left, low, high)
# 当前节点在区间范围内,递归修剪左右子树
root.left = self.trimBST(root.left, low, high)
root.right = self.trimBST(root.right, low, high)
return root

108. 将有序数组转换为二叉搜索树#

LeetCode 108. 将有序数组转换为二叉搜索树

class Solution:
# 分治 - 取中间元素作为根节点,左右子数组递归构造左右子树
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
return self.build(nums, 0, len(nums) - 1)
def build(self, nums: List[int], left: int, right: int) -> Optional[TreeNode]:
if left > right:
return None
# 取中间位置作为根,避免溢出写法
mid = left + (right - left) // 2
node = TreeNode(nums[mid])
# 递归构建左右子树
node.left = self.build(nums, left, mid - 1)
node.right = self.build(nums, mid + 1, right)
return node

538. 把二叉搜索树转换为累加树#

LeetCode 538. 把二叉搜索树转换为累加树

class Solution:
# 反中序遍历(右 -> 根 -> 左),累加和
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.prev = 0 # 累加和
return self.traverse(root)
def traverse(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
self.traverse(root.right) # 遍历右子树
self.prev += root.val # 更新累加值
root.val = self.prev # 当前节点值替换为累加和
self.traverse(root.left) # 遍历左子树
return root
代码随想录算法训练营第十八天 | 二叉树 Part08
https://fuwari.vercel.app/posts/code_musings_day_eighteen/
作者
Jarrett
发布于
2025-07-01
许可协议
CC BY-NC-SA 4.0