[100天算法】-二叉树剪枝(day 48)

题目描述

复制代码
给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。

返回移除了所有不包含 1 的子树的原二叉树。

( 节点 X 的子树为 X 本身,以及所有 X 的后代。)

示例1:
输入: [1,null,0,0,1]
输出: [1,null,0,null,1]

示例2:
输入: [1,0,1,0,0,0,1]
输出: [1,null,1,null,1]

示例3:
输入: [1,1,0,1,1,0,1,0]
输出: [1,1,0,1,1,null,1]

说明:

给定的二叉树最多有 100 个节点。
每个节点的值只会为 0 或 1 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-pruning
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

用【产品经理法】的思维来解决递归问题。

产品

假设我们已经有了一个 pruneTree 方法,可以把一棵树中不包含 1 的枝节删掉。

子问题

明显是 pruneTree(root.left) 和 pruneTree(root.right)。

大小问题的关系

首先,对于 root,我们用 pruneTree(root.left) 和 pruneTree(root.right) 的结果分别替换掉原本的 root.left 和 root.right。接着,再决定当前这棵树要不要保留。

  • 如果此时左右子树有一个不为空的话,那说明这棵树是要保留的,直接返回 root 就行。
  • 如果左右子树都为空,那我们就判断 root.val 的值,等于 1 就返回 root,等于 0 就返回 null 把这棵树移除。

递归出口

空节点直接返回 null 就行。

代码

TypeScript Code

复制代码
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function pruneTree(root: TreeNode | null): TreeNode | null {
    if (!root) return null;

    root.left = pruneTree(root.left);
    root.right = pruneTree(root.right);

    return root.left || root.right || root.val === 1 ? root : null;
}

复杂度分析

  • 时间复杂度:O(N),N 为二叉树节点数。
  • 空间复杂度:O(H),H 为二叉树的高度,递归栈的最大空间。
相关推荐
启观川4 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸4 小时前
排序算法介绍
python·算法·排序算法
Rocky Ding*4 小时前
MOSS-VL技术原理深度解析:让视觉流持续进入生成过程,实时 Agent 才有架构基础
论文阅读·人工智能·深度学习·机器学习·aigc·多模态·ai-native
田里的水稻5 小时前
EP_ROS2的相机视频流传递说明
数码相机·机器学习
加强洁西卡5 小时前
【AI】机器学习常见的指标及其解释
人工智能·机器学习
动词ing5 小时前
【题目练习】算法 组合总和||
算法
longlongzihan5 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
面包狗AI4S5 小时前
【AI4S】生化环材高可信技术与产业周报(2026-10-03—2026-10-09)
人工智能·深度学习·机器学习·ai
专业程序开发源5 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1016 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法