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

[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 为二叉树的高度,递归栈的最大空间。

相关文章:

  • [shell,hive] 在shell脚本中将hiveSQL分离出去
  • 【c++|opencv】二、灰度变换和空间滤波---3.均值滤波
  • Python武器库开发-常用模块之base64模块(十四)
  • [Unity][VR]透视开发系列4-解决只看得到Passthrough但看不到Unity对象的问题
  • linux远程桌面管理工具xrdp
  • 3D医学三维技术影像PACS系统源码
  • 【不用开发板学习STM32】可设置电子时钟
  • 基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)
  • 大数据前置学习基础准备(非常详细!)
  • 设计模式——观察者模式(Observer Pattern)+ Spring相关源码
  • 汽车托运如何确保安全
  • 企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  • 【蓝桥杯 第十四届省赛Java B组】真题训练(A - C)正在更新
  • 什么是神经网络,它的原理是啥?(1)
  • C++二分查找算法的应用:俄罗斯套娃信封问题
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • C++类中的特殊成员函数
  • Flex布局到底解决了什么问题
  • github指令
  • Java教程_软件开发基础
  • Laravel 中的一个后期静态绑定
  • mysql常用命令汇总
  • Python_OOP
  • python3 使用 asyncio 代替线程
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Terraform入门 - 1. 安装Terraform
  • Vultr 教程目录
  • 成为一名优秀的Developer的书单
  • 使用SAX解析XML
  • 使用权重正则化较少模型过拟合
  • 网页视频流m3u8/ts视频下载
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • # Apache SeaTunnel 究竟是什么?
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (4)STL算法之比较
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C)一些题4
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (理论篇)httpmoudle和httphandler一览
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十六)串口UART
  • (转) 深度模型优化性能 调参
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .bat文件调用java类的main方法
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net访问oracle数据库性能问题
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []T 还是 []*T, 这是一个问题
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C++核心编程](四):类和对象——封装