LeetCode刷题--- 二叉树剪枝

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏:http://t.csdnimg.cn/ZxuNL

                 http://t.csdnimg.cn/c9twt


前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


二叉树剪枝题目

题目链接:二叉树剪枝

题目:

给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。

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

节点 node 的子树为 node 本身加上所有 node 的后代。

示例 1:

输入:root = [1,null,0,0,1]
输出:[1,null,0,null,1]
解释:
只有红色节点满足条件“所有不包含 1 的子树”。 右图为返回的答案。

示例 2:

输入:root = [1,0,1,0,0,0,1]
输出:[1,null,1,null,1]

示例 3:

输入:root = [1,1,0,1,1,0,1,0]
输出:[1,1,0,1,1,null,1]

提示:

  • 树中节点的数目在范围 [1, 200] 内
  • Node.val 为 0 或 1

解法

题目解析

这道题目的意思很简单,给我们一个二叉树的根节点(root节点),删除这棵二叉树所有不包含1(val != 1)的节点

例如:


算法原理思路讲解   

如果我们选择从上往下删除,我们需要收集左右⼦树的信息,这可能导致代码编写相对困难。
如下图所示,我们若想删除标红的节点,我们需要收集左右⼦树的信息
如果我们先删除最底部的叶⼦节点,然后再处理删除后的节点,操作起来比较简单
如下图所示,我们若想删除标红的节点,直接删除即可
因此,我们可以采⽤后序遍历的⽅式来解决这个问题
  1. 我们先处理左⼦树,然后处理右⼦树,最后再处理当前节点。
  2. 在处理当前节点时,我们可以判断其是否为叶⼦节点且其值是否为 0, 如果满⾜条件,我们可以删除当前节点。
  • 需要注意的是,在删除叶⼦节点时,其父节点很可能会成为新的叶⼦节点。因此,在处理完⼦节点后,我们仍然需要处理当前节点。这也是为什么选择后序遍历的原因(后序遍历⾸先遍历到的⼀定是叶⼦节点)
  • 通过使⽤后序遍历,我们可以逐步删除叶⼦节点,并且保证删除后的节点仍然满⾜删除操作的要求。这样,我们可以较为⽅便地实现删除操作,⽽不会影响最终的结果。
  • 若在处理结束后所有叶⼦节点的值均为 1,则所有⼦树均包含 1,此时可以返回

  1、设计函数头


TreeNode* dfs(TreeNode* root)
  • 返回值:根节点
  • 参数 :当前需要处理的节点
  • 函数作⽤:判断当前节点是否需要删除,若需要删除,则删除当前节点。

2、设计函数体和函数出口

进行后序遍历,若遇到叶子节点并且val值为0,那么删除该节点

if (root == nullptr)return nullptr;root->left = dfs(root->left);root->right = dfs(root->right);if(root->left == nullptr && root->right == nullptr && root->val == 0){delete root; // 防⽌内泄漏root = nullptr;}return root;

以上思路就讲解完了,大家可以先自己先做一下


  • 时间复杂度:O(n),其中 n 是二叉树节点的个数。每个节点都需要遍历一次。
  • 空间复杂度:O(n),其中 n 是二叉树节点的个数。递归的深度最多为 O(n)。

代码实现

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* pruneTree(TreeNode* root) {if (root == nullptr)return nullptr;root->left = pruneTree(root->left);root->right = pruneTree(root->right);if(root->left == nullptr && root->right == nullptr && root->val == 0){delete root; // 防⽌内泄漏root = nullptr;}return root;}
};

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

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

相关文章

NFTScan | 12.04~12.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.12.04~ 2023.12.10 NFT Hot News 01/ NFTScan 与 MintCore 联合推出适用于 NFT 的 Layer2 网络 Mint 12 月 5 日,根据官方消息,NFT 基础设施服务商 NFTScan …

NFC物联网解决方案应用实例:基于NFC的通用物流链防伪溯源

NFC物联网系统解决方案已在某局进行推广应用,给出了某省内出口蔬菜水果检验检疫监管的物联网解决方案。 依据相关法规,出口蔬菜必须在质检总局注册种植基地进行种植,出口前按批次向产地检验检疫部门进行申报,按时在集中监管区统一…

Python+selenium自动化生成测试报告

前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导…

SpringBoot系列之基于Jedis实现分布式锁

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境,我们使用最多的是juc包里的单机锁,但是随着微服务分布式项目的普及,juc里的锁是不能控制分布锁环境的线程安全的,因为单机锁只能控制同个进程里的线程安全&…

Java实现选择排序及其动图演示

选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的元素中选出最小(或最大)的元素,然后将其放到已排序的序列的末尾。具体步骤如下: 首先,找到未排序序列中的最小(或最大)元素&a…

PyInstaller 打包 Python 脚本为 .exe 可执行文件闪退、No Model named XXX问题

文章目录 前言.exe 可执行文件闪退No Model named XXXPython 环境问题查看当前python路径查看当前python环境使用的site-package路径 个人简介 前言 在上一篇文章中,我们介绍了如何将 Python 脚本打包为 .exe 可执行文件,但有时候打包生成的 .exe 文件会…

记录hive/spark取最新且不为null的方法

听标题可能听不懂我想表达的意思,我来描述一下我要做的事: 比如采集同学对某一网站进行数据采集,同一个用户每天会有很多条记录,所以我们要取一条这个用户最新的状态,比如用户改了N次昵称,我们只想得到最后…

MATLAB代码:含电热联合系统的微电网运行优化

微♥关注“电击小子程高兴的MATLAB小屋”获取专属优惠 说明书 MATLAB代码:含电热联合系统的微电网运行优化 关键词:微网 电热联合系统 优化调度 参考文档:《含电热联合系统的微电网运行优化》完全复现 仿真平台:MATLAB yalmi…

2024年AI云计算专题研究报告:智算带来的变化

今天分享的人工智能系列深度研究报告:《2024年AI云计算专题研究报告:智算带来的变化》。 (报告出品方:华泰证券) 报告共计:32页 Al 云计算 2024:关注智算带来的新变化 通过对海内外主要云厂商及其产业链…

C# WPF上位机开发(日志调试)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 程序开发的过程中,调试肯定是少不了的。比如说,这个时候,我们可以设置断点、查看变量、检查函数调用堆栈等等。…

目标检测锚框

目标检测锚框 最开始呢,我们需要先介绍一下框,先学会一下怎么画框 导入所需要的包 from PIL import Image import d2lzh_pytorch as d2l import numpy as np import math import torch展示一下本次实验我们用到的图像,猫狗 d2l.set_figsiz…

Uncaught ReferenceError: jQuery is not defined解决方法

当我在写java的Maven项目时,出现了这样的一个报错信息: 我一直找代码,抓包,调试,比对代码 jQuery未定义就是指JS的导包没有导进来!!!! 导进来就运行正常啦

SpringBoot集成系列--Kakfa

文章目录 一、代码1、添加依赖2、配置kafka3、创建生产者4、创建消费者5、测试 二、遇到问题1、could not be established. Broker may not be available2、Error while fetching metadata with correlation id xxx 一、代码 1、添加依赖 在pom.xml文件中添加Kafka的依赖 &l…

docker---资源控制

docker的资源控制 对容器使用宿主机的资源进行限制。 三种控制方向:CPU 内存 磁盘I/O docker使用linux自带的功能cgroup;control groups是linux内核系统提供的一种可以限制记录,隔离进程所使用的物理资源机制。 docker借助此…

excel数据重复率怎么计算【保姆教程】

大家好,今天来聊聊excel数据重复率怎么计算,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: excel数据重复率怎么计算 在Excel中计算数据重复率可以通过以下步骤实现: 1. 确定重复…

redis的深度理解

上篇博客我们说到了redis的基本概念和基本操作,本篇我们就更深入去了解一些redis的操作和概念,我们就从red的主从同步、redis哨兵模式和redis集群三个方面来了解redis数据库 一、主从同步 像MySQL一样,redis是支持主从同步的,而…

排序的简单理解(下)

4.交换排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。 4.1 冒泡排序 冒泡排序&#xff08…

vue3若依框架,在页面中点击新增按钮跳转到新的页面,不是弹框,如何实现

在router文件中的动态路由数组中新增一个路由配置,这个配置的就是新的页面。 注意path不要和菜单配置中的路径一样,会不显示内容。 在菜单配置中要写权限标识就是permissions:[]里的内容 在children里的path要写占位符info/:data 点击新增按钮&#x…

HTML+CSS高频面试题

面试题目录 前言1.讲一下盒模型,普通盒模型和怪异盒模型有什么区别2.CSS如何实现居中3.讲一下flex弹性盒布局4.CSS常见的选择器有哪些?优先级5.长度单位px 、em、rem的区别6.position属性的值有哪些7.display属性的值有哪些,分别有什么作用8.…

std::map

一 emplace() emplace_hint() try_emplace()区别 1. emplace template< class... Args >std::pair<iterator, bool> emplace( Args&&... args ); 若容器中没有拥有该键的元素&#xff0c;则向容器插入以给定的 args 原位构造的新元素。 细心地使用 em…