《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

题目链接:LCR 047. 二叉树剪枝 - 力扣(LeetCode)

题目

一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中所有节点的值全都是 0 的子树。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的子树之后的结果如下图 (b) 所示。

分析

首先分析哪些子树会被剪除,哪些子树不能被剪除。在上图 (a) 的二叉树中,以第 2 层第 1 个节点为根节点的子树的 3 个节点的值都是 0,因此整棵二叉树都被剪除。以第 2 层第 2 个节点为根节点的子树中有一个节点的值是 1(第 3 层第 4 个节点),因此这棵子树不能删除,但是它的左子树(根节点为第 3 层第 3 个节点)只有一个节点并且值为 0,因此它的左子树可以被剪除。

下面总结什么样的节点可以被删除。首先,这个节点的值应该是 0。其次,如果它有子树,那么它的子树的所有节点的值都为 0。也就是说,如果一个节点可以被删除,那么它的子树的所有节点都可以被删除。例如,在上图 (a) 的二叉树中,第 2 层第 1 个节点可以被删除,它的子树中的所有节点(第 3 层第 1 个节点和第 2 个节点)也可以被删除。

由此发现,后序遍历最适合用来解决这个问题。如果用后序遍历的顺序遍历到某个节点,那么它的左右子树的节点一定已经遍历过了。每遍历到一个节点,就要确定它是否有左右子树,如果左右子树都是空的,并且节点的值是 0,那么就可以删除这个节点。

代码实现

class Solution {
public:TreeNode* pruneTree(TreeNode* root) {if (!root)return nullptr;root->left = pruneTree(root->left);root->right = pruneTree(root->right);if (!root->left && !root->right && root->val == 0)return nullptr;return root;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471144.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis为什么使用跳跃表而不是树

Redis中支持五种数据类型中有序集合Sorted Set的底层数据结构使用的跳跃表,为何不使用其他的如平衡二叉树、b树等数据结构呢? 1,redis的设计目标、性能需求: redis是高性能的非关系型(NoSQL)内存键值数据…

BossPlayerCTF

靶场环境问题 靶场下载之后,可能会出现扫描不到IP的情况,需要进行调整,参考: Vulnhub靶机检测不到IP地址_vulnhub靶机nmap扫不到-CSDN博客 该靶机没有vim,需要使用vi命令去修改;改成当前网卡即可&#x…

计算机二级数据库之数据模型(三层相关的结构)

数据模型 模型的概念 模型的介绍模型是对现实世界特征的模拟和抽象, 数据模型的概念: 数据模型是对现实世界中数据特征的抽象,描述的是数据的共性。 数据模型是用来在数据库中抽象、表示和处理现实世界中的数据和信凹。 其相关的共同特…

[office] Excel设置打印表头 #学习方法#学习方法#微信

Excel设置打印表头 有时候需要在每页上都显示表头,这样好查看数据,下面我们来看一个练习; 1、启动Excel 1)点击“开始-所有程序-Microsoft-Microsoft Office Excel 2003"; 2)出现一个满是格子的空白窗口,这就是一张电子表格了&#x…

大漠插件7.2405

工具名称:大漠插件7.2405 更新时间2024-2-2更新内容/v7.24051. 解决LoadAi接口在某些系统上无法加载的BUG2. 驱动功能全面支持win11 22631/ 工具简介:大漠 综合 插件 (dm.dll)采用vc6.0编写,识别速度超级快! 采用COM接口编写,适用于所有编程语…

2.12日学习打卡----初学RocketMQ(三)

2.12日学习打卡 目录: 2.12日学习打卡一. RocketMQ高级特性(续)消息重试延迟消息消息查询 二.RocketMQ应用实战生产端发送同步消息发送异步消息单向发送消息顺序发送消息消费顺序消息全局顺序消息延迟消息事务消息消息查询 一. RocketMQ高级特…

不花一分钱,在 Mac 上跑 Windows(M1/M2 版)

这是在 MacOS M1 上体验最新 Windows11 的效果: VMware Fusion,可以运行 Windows、Linux 系统,个人使用 licence 免费 安装流程见 👉 https://zhuanlan.zhihu.com/p/452412091 从申请 Fusion licence 到下载镜像,再到…

Compose自定义动画API指南

很多动画API都可以自定义其参数达到不同的效果,Compose也提供了相应的API供开发者进行自定义动画规范。 AnimationSpec 主要用存储动画规格,可以自定义动画的行为,在animate*AsState和updateTransition函数中,此函数默认参数为s…

【C++】 为什么多继承子类重写的父类的虚函数地址不同?『 多态调用汇编剖析』

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 🌝每一个不曾起舞的日子,都是对生命的辜负 前言 本篇文章主要是为了解答有…

《剑指offer》

本专题是分享剑指offer的一些题目,开始刷题计划。 二维数组的中的查找【https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId13&tqId11154&ru/exam/oj】 描述 在一个二维数组array中(每个一维数组的长度相同&#xff0…

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件?3. 具体使用中间件3.1 中间件所在的位置:在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释:在浏览器在请求服务器的时候,首先要…

【JAVA-Day88】Java字符串和JSON对象的转换

Java字符串和JSON对象的转换 Java字符串和JSON对象的转换摘要引言一、什么是JSON二、JSON的应用场景三、JSON对象转字符串3.1 使用 Jackson 库实现 JSON 对象转字符串3.2 使用 Gson 库实现 JSON 对象转字符串 四、JSON字符串转对象4.1 使用 Jackson 库实现 JSON 字符串转对象4.…