当前位置: 首页 > news >正文

day18-数据结构力扣

669. 修剪二叉搜索树

题目链接 669. 修剪二叉搜索树 - 力扣(LeetCode)

思路

利用二叉搜索树左小右大的特性递归处理

若当前节点值小于下界 `low`,则该节点及其左子树均不在区间内,只需递归修剪并返回其右子树

若当前节点值大于上界 `high`,则该节点及其右子树均不在区间内,只需递归修剪并返回其左子树

若节点值在 `[low, high]` 范围内,则保留该节点

同时递归修剪其左右子树并重新连接,最终得到修剪后的合法二叉搜索树。

提交

class Solution: def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]: if not root: return root # 当前节点值 < 下界,整棵左子树都无效,只保留并修剪右子树 if root.val < low: right = self.trimBST(root.right, low, high) return right # 当前节点值 > 上界,整棵右子树都无效,只保留并修剪左子树 if root.val > high: left = self.trimBST(root.left, low, high) return left # 当前节点在范围内,正常修剪左右子树并连接 root.left = self.trimBST(root.left, low, high) root.right = self.trimBST(root.right, low, high) return root
  • 节点 < 下界

  • 左子树所有节点都比它更小 →直接丢掉整个左子树只保留右子树,继续修剪右子树并返回

  • 节点 > 上界

  • 右子树所有节点都比它更大 →直接丢掉整个右子树只保留左子树,继续修剪左子树并返回

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

题目链接108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

思路

我刚开始是想找到根节点,然后左右两边依次排,但是我代码写出来通过23/31

怎么说,还是提升了一点,能写递归能通过20多个用例,最开始啥都不会。

看一下题解

原来先找到根节点的思路没有问题,是因为我递归又加了for循环才超时的

好像这里for循环很多余,直接删掉,再加上递归的结束条件就可以提交了

提交

# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]: # 递归终止条件:数组为空,返回空 if not nums: return None # 取中间位置作为根节点(高度平衡BST核心) mid = (len(nums) - 1) // 2 root = TreeNode(nums[mid]) # 左半数组 → 左子树 root.left = self.sortedArrayToBST(nums[:mid]) # 右半数组 → 右子树 root.right = self.sortedArrayToBST(nums[mid+1:]) return root

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

题目链接538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

思路

刚开始没想到

规则:每个节点的值 = 原树中 ≥ 它的所有节点之和

正确做法:

  • 反序中序遍历:右 → 根 → 左(从大到小遍历)

  • 用一个变量累加和,边遍历边更新节点值

他这里有一个技巧就是反序中序遍历,那为什么会想到这个,因为正序的不好做。或者说更麻烦一点

我之前的思路是把中序遍历,得到数组,然后得到mid,每次算nums[mid:]求和。

提交

# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]: self.total = 0 # 记录累加和 self.dfs(root) return root # 反序中序遍历:右 → 根 → 左 def dfs(self, root): if not root: return # 先遍历右子树(更大的数) self.dfs(root.right) # 更新当前节点值 self.total += root.val root.val = self.total # 再遍历左子树(更小的数) self.dfs(root.left)

然后二叉树的题就结束了?对,但其实还掌握的不够扎实,但是慢慢来吧。

http://www.jsqmd.com/news/607011/

相关文章:

  • Live2D资源提取技术实战:从瓶颈突破到跨领域应用
  • OmAgent与本地模型部署:使用Ollama和LocalAI的完整教程
  • ComfyUI InstantID完整指南:掌握AI人脸控制的终极技巧
  • 瑞祥卡回收全过程解析:从新手到高手的进阶攻略 - 团团收购物卡回收
  • 雅浪卫浴靠谱吗能做浴室柜定制吗 - mypinpai
  • [TOOLS] 优化Verdi波形调试效率的关键技巧
  • Python 异步 async/await:为什么 AI 框架大量使用?| 基础篇
  • 开源项目的合规边界:从PyWxDump移除事件看技术伦理与法律风险
  • 关于各种服务器
  • 深入芋道yudao-cloud源码:OAuth2 Client Credentials模式如何用虚拟用户ID巧妙实现?
  • VoxCPM-1.5-WEBUI快速上手:3步搭建高保真文本转语音服务
  • 支付宝立减金回收指南:如何轻松兑现优惠? - 团团收购物卡回收
  • 分析2026年北京雪糕小时达服务,哪家供应商更值得选? - myqiye
  • OpenClaw调用Qwen3-14B私有镜像:低成本替代OpenAI API方案
  • 尚壹彩广告喷绘签约深圳昊客网络阿里代运营与 豆包GEO 推广:携手打造共赢未来 - 深圳昊客网络
  • AAV病毒包装优化全流程:三质粒比例、空壳率控制与GMP转染解决方案【曼博生物官方独家提供Polysciences产品】 - 上海曼博生物
  • DAMOYOLO-S模型推理效率深度优化:利用CUDA与多线程提升吞吐量
  • 总结北京雪糕厂招聘需求,这些岗位等你来 - mypinpai
  • 不规则PCB的接地—连续回流与噪声抑制核心策略
  • AWPortrait-Z使用技巧:如何用历史记录快速复现最佳效果
  • 2026希腊买房移民中介服务解析与选择参考 - 品牌排行榜
  • Sonic云真机平台核心架构解析:微服务设计原理与实现
  • KMS激活全攻略:解决Windows与Office授权难题的终极指南
  • Design.md:让 AI 一致性进行前端 UI 设计的解决方案
  • 成都雅致尚品文化传播公司:成都武侯区会展桌 会展沙发椅租赁费用多少 - LYL仔仔
  • Vue3+Vite+TypeScript+ElementPlus项目最优配置
  • Wan2.2-I2V-A14B生成作品画廊:建筑设计与室内装修方案动态展示
  • [FastMCP设计、原理与应用-01] Hello, MCP
  • VibeVoice-TTS快速上手:5步生成你的第一个多人对话音频
  • 新手必读:万爱通礼品卡回收使用技巧和省钱秘诀 - 团团收购物卡回收