387 字
2 分钟
代码随想录算法训练营第十八天 | 二叉树 Part08
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. 将有序数组转换为二叉搜索树
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. 把二叉搜索树转换为累加树
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/