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

LC.669 | 修剪二叉搜索树 | 树 | 递归与重连

输入:
二叉搜索树的根节点root,以及最小边界low和最大边界high

要求:
修剪该二叉搜索树,使得所有节点的值都在[low, high]之间。
注意:可能需要改变树的根节点,修剪后的树必须保持二叉搜索树的相对结构(即:父子关系虽变,但原来的后代如果保留下来了,相对大小关系不变)。

输出:
修剪好的二叉搜索树的新的根节点TreeNode*


思路:

这是一道经典的递归题目,借着这题来回顾一下递归三要素。

1. 确定递归函数的定义:

  • 函数trim(root, low, high)的含义是:“给我一棵树的根节点root,我帮你把不符合[low, high]范围的节点剪掉,然后把修剪后合法的树的根节点返回给你。”
  • 这点非常重要:我们通过返回值来接收修剪后的结果,并用来更新父节点的指针。

2. 确定递归终止条件:

  • 如果root为空(nullptr),说明遍历到了空节点,没什么好修剪的,直接返回nullptr

3. 确定单层递归逻辑(核心剪枝逻辑):
利用二叉搜索树(BST)的有序性(左 < 根 < 右)进行判断:

  • 情况 A:当前节点太小了 (root->val < low)

    • 既然当前节点都比low小,那么根据 BST 性质,它的左子树里所有节点肯定都比low小。
    • 决策:当前节点和它的左子树都要被“抛弃”。
    • 希望:它的右子树里可能还有比当前节点大、且在[low, high]范围内的节点。
    • 操作:直接去修剪右子树,并把修剪后的结果作为新的根返回。即return trim(root->right, ...)
  • 情况 B:当前节点太大了 (root->val > high)

    • 同理,既然当前节点都比high大,那么它的右子树肯定全废了。
    • 决策:当前节点和它的右子树都要被“抛弃”。
    • 希望:它的左子树里可能还有比当前节点小、且符合要求的节点。
    • 操作:直接去修剪左子树,并把结果返回。即return trim(root->left, ...)
  • 情况 C:当前节点在范围内 (low <= root->val <= high)

    • 决策:当前节点是合法的,必须保留
    • 隐患:虽然当前节点合法,但它的左孩子可能太小,右孩子可能太大。
    • 操作
      1. 让左孩子去接受修剪:root->left = trim(root->left, ...)
      2. 让右孩子去接受修剪:root->right = trim(root->right, ...)
      3. 左右都修整好了,返回当前节点root

复杂度:

  • 时间复杂度:O(N)
    • 每个节点最多被访问一次。
  • 空间复杂度:O(H)
    • H 为树的高度,递归调用栈的深度。

classSolution{public:TreeNode*trimBST(TreeNode*root,intlow,inthigh){returntrim(root,low,high);}TreeNode*trim(TreeNode*root,intlow,inthigh){if(!root){returnnullptr;}if(root->val>=low&&root->val<=high){root->left=trim(root->left,low,high);root->right=trim(root->right,low,high);returnroot;}elseif(root->val<low){returntrim(root->right,low,high);}elseif(root->val>high){returntrim(root->left,low,high);}returnroot;}};
http://www.cnnetsun.cn/news/90316.html

相关文章:

  • DAY29 pipeline管道
  • A29语音模组:100dB消回音黑科技,超大音量下也能清晰通话
  • 1688 拍立淘接口(item_search_img)技术全景解析
  • Dify如何逆向解析加密PDF?,深入剖析现代文档安全的攻防博弈
  • 测试工程师必备:利用Apipost AI编写脚本,快速实现多接口串联流程
  • IP 扫盲:不要再迷信家宽
  • 基于协同过滤算法的动漫推荐系统源码 Java+SpringBoot+Vue3
  • 高效量子电路设计秘籍(R驱动的3种前沿优化策略)
  • 分分钟带你杀入Kaggle Top 1%,大牛带队,100%拿牌!
  • IP6808至为芯支持PD快充输入的15W无线充电方案SOC芯片
  • 笔记本重装系统超详细指南(附系统备份还原技巧,告别电脑店花费)
  • 大型地源热泵机组多高
  • 别墅供暖地源热泵
  • Traefik:为云原生而生的自动化反向代理
  • P1043 [NOIP 2003 普及组] 数字游戏
  • Web安全攻防学习图谱:90天从网安小白到漏洞猎人(超详细),看这一篇就够了!
  • 【Docker镜像优化黄金法则】:让边缘Agent更小更快更安全
  • 前端vue3 web端中实现拖拽功能实现列表排序
  • 【音视频开发必看】Dify 1.7.0音频转换避坑指南:5大常见错误及修复方案
  • VSCode+PlatfoemIO+ESP32-Cam + MB烧录器 入门测试
  • 【加密PDF解析避坑指南】:Dify错误处理的5大核心策略与实战技巧
  • 性能测试入门:使用 Playwright 测量关键 Web 性能指标
  • 从入门到精通:R语言极值分布拟合在气象数据中的4个关键步骤
  • 仅1%人掌握的建模技术:R语言金融相关性矩阵稀疏化处理实战
  • 超越传统PLM理念,定义行业新标准:全星研发项目管理APQP软件系统
  • 【安全专家亲授】私有化Dify的SSL配置秘诀:保障数据传输不被窃取
  • Vue3+JS 高级前端面试题
  • 海康威视智能工厂,是如何走向“领航”的?
  • 《深入昇腾底层:Ascend C 编程模型与高性能算子开发实战》
  • 实战 Ascend C:从零实现高性能自定义算子