【LeetCode 刷题】二叉树-二叉搜索树的修改与构造

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉搜索树的修改与构造相关的题目解析。

文章目录

701.二叉搜索树中的插入操作

题目链接

python 复制代码
class Solution:
    def insertIntoBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root:
            return TreeNode(val)
        if root.val < val:
            root.right = self.insertIntoBST(root.right, val)
        else:
            root.left = self.insertIntoBST(root.left, val)
        return root
  • 类似于二分查找,当 root 为空时,表明找到了插入位置,创建新的 TreeNode 返回

450.删除二叉搜索树中的节点

题目链接

python 复制代码
class Solution:
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root:
            return None
        if root.val < key:
            root.right = self.deleteNode(root.right, key)
        elif root.val > key:
            root.left = self.deleteNode(root.left, key)
        else:
            if not root.left:
                return root.right
            if not root.right:
                return root.left
            ptr = root.right
            while ptr.left:
                ptr = ptr.left
            ptr.left = root.left
            root = root.right
        return root
  • 要删除的节点可能会存在以下情况:
    • 左/右子树为空:直接返回另一侧的子树
    • 左/右子树都不空:需要修改树的结构,上述代码的逻辑为让 root.right 节点继位,需要将 root.left 节点代表的子树转移到刚好比 root 大的下一个位置(也即 root.right 子树中的最左侧节点)的左子树上
  • ptr 即为找 root.right 中最左侧的节点的指针

669. 修剪二叉搜索树

题目链接

python 复制代码
class Solution:
    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)
        elif root.val > high:
            return self.trimBST(root.left, low, high)
        else:
            root.left = self.trimBST(root.left, low, high)
            root.right = self.trimBST(root.right, low, high)
            return root
  • 注意:例如当 root.val < low 时,不能直接返回 root.right,因为丢弃了左子树后,右子树还有可能因为节点值大于 high 而被修剪

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

题目链接

python 复制代码
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return None
        mid = len(nums) // 2
        left = self.sortedArrayToBST(nums[:mid])
        right = self.sortedArrayToBST(nums[mid+1:])
        return TreeNode(nums[mid], left, right)
相关推荐
地平线开发者11 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮11 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者12 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考12 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
孟健14 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
HXhlx15 小时前
CART决策树基本原理
算法·机器学习
码路飞16 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
Wect16 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱16 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
曲幽18 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers