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

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

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

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

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

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

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

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

​为何这样设计?​

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

代码实现

java 复制代码
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;
    }
}

示例推演

java 复制代码
原始树:        递归后:        返回结果:
    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) 时间完成复杂裁剪
相关推荐
木头程序员1 分钟前
机器学习核心知识点汇总
大数据·人工智能·机器学习·kmeans·近邻算法
wefg18 分钟前
【算法】动态规划
算法·动态规划
张祥64228890411 分钟前
误差理论与测量平差基础四
人工智能·机器学习·概率论
机器学习之心18 分钟前
198种组合算法+优化TCN-Transformer+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
深度学习·算法·transformer·shap分析·新数据预测
狐5719 分钟前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
Gorgous—l19 分钟前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
小郭团队20 分钟前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
瑞雨溪25 分钟前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
LeeeX!27 分钟前
基于YOLO11实现明厨亮灶系统实时检测【多场景数据+模型训练、推理、导出】
深度学习·算法·目标检测·数据集·明厨亮灶
红队it28 分钟前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark