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

(每日一道算法题)二叉树剪枝

814. 二叉树剪枝 - 力扣(LeetCode)

算法思路:深度优先的后序遍历

​核心逻辑​​:自底向上检查每棵子树,只有全零叶子节点才被移除。

​后序遍历顺序​​:先递归处理左右子树,再判断当前节点

  • 确保子树已被修剪,当前节点基于最新子树状态决策

​删除条件​​:仅当节点同时满足

  • 节点值为 0
  • 无左子树(left == null
  • 无右子树(right == null)
    时才被移除(返回 null 断开父节点引用)

​为何这样设计?​

  • 非叶子节点即使值为 0,只要连接有效子树(含 1)就不能删除(如示例1的 0 节点)
  • 后序遍历保证从叶子向上处理,避免重复判断

代码实现 

class Solution {public TreeNode pruneTree(TreeNode root) {if (root == null) return null;// 先递归处理子树root.left = pruneTree(root.left);root.right = pruneTree(root.right);// 当且仅当是叶子节点且值为0时移除if (root.val == 0 && root.left == null && root.right == null) {return null;}return root;}
}

示例推演 

原始树:        递归后:        返回结果:1            1              1\            \              \0    →       0     →         0/ \             \               \0   1             1               1
  1. 递归到左叶节点 0​:
    满足 val=0 且无子树 → 返回 null(移除)
    → 父节点 0 的左子树置为 null
  2. ​处理父节点 0​:
    值 0 但右子树含 1 → 保留
  3. ​根节点 1​:
    值 1 直接保留,最终形成新结构

关键步骤解析

​深度递归​
root.left = pruneTree(root.left) 先深入到左子树底部
root.right = pruneTree(root.right) 再深入到右子树底部
(形成自底向上的处理链)

​精准剪枝​
if (root.val == 0 && root.left == null && root.right == null)
仅当当前节点是值为 0 的叶子节点时才移除,保留两种情况:

  • 值为 1 的节点(无论是否叶子)
  • 值为 0 但连接有效子树的中间节点

​时间复杂度​

  • O(n):每个节点仅访问一次(n 为节点数)
  • 空间复杂度 O(h):递归栈深度(h 为树高,最坏 O(n))

总结

通过​​后序遍历+叶子节点精准判断​​实现高效剪枝:

  • 适用场景:树型数据处理中移除无效分支(如零值配置、空目录清理)
  • 扩展思考:若修改为"保留至少含一个 1 的子树",代码逻辑不变(本解法已实现)
  • 工程启示:递归深度优先搜索是处理树型结构的利器,以 O(n) 时间完成复杂裁剪


文章转载自:

http://UqI1J3hd.hmktd.cn
http://nuXSnDpx.hmktd.cn
http://aP9ZIkd5.hmktd.cn
http://ncMhKFqQ.hmktd.cn
http://APsC6qBC.hmktd.cn
http://wX7kqb2V.hmktd.cn
http://4EkP1mQ6.hmktd.cn
http://DI4580Gj.hmktd.cn
http://zdWGdCMK.hmktd.cn
http://octQ2qcE.hmktd.cn
http://fu3qD7dA.hmktd.cn
http://LVhzeYnJ.hmktd.cn
http://W6BaQeFr.hmktd.cn
http://mpTwfzsG.hmktd.cn
http://rwkui77r.hmktd.cn
http://4t0fYPgg.hmktd.cn
http://3FaE4mzo.hmktd.cn
http://cJ1FKV0b.hmktd.cn
http://9118DNmR.hmktd.cn
http://1pDqdvxh.hmktd.cn
http://umpIFEjO.hmktd.cn
http://gPx8XLcN.hmktd.cn
http://LgBGLZLx.hmktd.cn
http://PYT0XA3j.hmktd.cn
http://XcxBCnNH.hmktd.cn
http://UgyBbUVK.hmktd.cn
http://BXgHA8Jm.hmktd.cn
http://yzbzpxTC.hmktd.cn
http://jQgnBgOW.hmktd.cn
http://4U4f8l6N.hmktd.cn
http://www.dtcms.com/a/236634.html

相关文章:

  • JDK17 Http Request 异步处理 源码刨析
  • nginx日志的一点理解
  • moon游戏服务器-demo运行
  • 计算机网络第2章(下):物理层传输介质与核心设备全面解析
  • 通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
  • IT学习方法与资料分享
  • Windows 下搭建 Zephyr 开发环境
  • VSCode CUDA C++进行Linux远程开发
  • 无法与IP建立连接,未能下载VSCode服务器
  • Redis线程安全深度解析:单线程模型的并发智慧
  • python学习打卡day47
  • PCDF (Progressive Continuous Discrimination Filter)模块构建
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • 如何配置 MySQL 允许远程连接
  • 从内存角度透视现代C++关键特性
  • 一些因子的解释
  • Python控制台输出彩色字体指南
  • Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
  • Redis :String类型
  • iOS 门店营收表格功能的实现
  • 《Vuejs设计与实现》第 8 章(挂载与更新)
  • SUSE Linux 发行版全面解析:从开源先驱到企业级支柱
  • 青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
  • Srping Cloud Gateway 跨域配置 CorsWebFilter
  • # 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
  • C# 类和继承(扩展方法)
  • 【基础算法】枚举(普通枚举、二进制枚举)
  • redis分片集群架构
  • Python60日基础学习打卡Day46
  • 物联网协议之MQTT(二)服务端