【递归搜索回溯专栏】专题二:二叉树中的深搜----二叉树剪枝

本专栏内容为:递归,搜索与回溯算法专栏。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:递归搜索回溯专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

专题二

  • 题目来源
  • 题目描述
  • 题目解析
  • 算法原理
  • 代码实现

题目来源

本题来源为:

Leetcode 814. 二叉树剪枝

题目描述

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

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

节点 node 的子树为 node 本身加上所有 node 的后代。
在这里插入图片描述
在这里插入图片描述

题目解析

把题目给的示例分析一下:
在这里插入图片描述
题目说返回移除了所有不包含 1 的子树的原二叉树。换句话是就是将二叉树中全是0的子树删除掉。

算法原理

对于碰到特别抽象的问题时,也就是说子问题很难发现时,我们可以通过决策树,抽象出递归的三个核心问题。

对于本题的子问题也还是很好想的,就是传一个根,将这个全部包含0的节点干掉,然后返回新的头指针。

以绿色这一层为例:要想将这一层剪枝,必须得让这个节点的左子树和右子树都为0时才能剪枝。那么肯定是后序遍历。

在这里插入图片描述
先看左下角这个节点,他的左右节点都为空,那么这个我们就可以把它干掉。那干掉了这个节点返回1节点时,1节点的左节点是不是要置空,那么怎么让他回去的时候将节点指向空呢?加一个返回值即可。当返回的时候把null给他。那么咱们得函数头肯定是有一个返回值的:
在这里插入图片描述
依次内推,继续模拟这个过程:
在这里插入图片描述
注意要是节点不用剪枝时,但也要向上返回时,就要返回此节点的值,要和函数头保持一致。

那么我们的函数体和出口已经出来了:
在这里插入图片描述

代码实现

如果笔试的话,可以不用delete,但是要是面试,可以问一下面试官节点是不是一个一个new出来的,要是New出来的很可能就会报错。

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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

操作系统内功篇:硬件结构之CPU缓存一致性

一 CPU Cache的数据写入 1.1 CPU Cache的结构 是由很多个Cache Line组成的,CPU Line是CPU从内存读取的基本单位,CPU Line是由多个标志数据块组成。 1.2 CPU Cache数据的写入 数据不仅仅只有读取,还有数据的写入,写入数据也是先…

Pycharm安装阿里云通义码灵插件图文教程

前提:必须安装pycharm,可以访问 pycharm下载链接打开页面下载 点击下载后,将下载文件打开,然后无脑安装,安装好后继续看。 然后就安装好了,然后关闭安装,然后打开pycharm即可。 🚀…

【力扣 - 合并区间】

题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [start_i, end_i] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…

蓝桥杯单片机快速开发笔记——NE555测频

一、原理分析 NE555作为一种多功能集成电路,在信号发生和频率测量方面具有广泛的应用。通过合理配置和连接外部元件,可以实现不同类型的信号发生和频率测量功能。 原理: 信号发生器: NE555可以配置为多种不同的振荡器电路&#x…

【你也能从零基础学会网站开发】Web建站之jQuery进阶篇 jQuery常见属性和方法概述与使用

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 jQuery创建新的…

Minio快速入门

Minio快速入门 1.1 Minio使用 1.1.1 Minio介绍 目前可用于文件存储的网络服务选择也有不少,比如阿里云OSS、七牛云、腾讯云等等,可是收费都有点小贵。为了节约成本,很多公司使用MinIO做为文件服务器。 官网:https://www.minio…

【教学类-44-06】20240318 0-9数字描字帖 A4横版整页(宋体、黑体、文鼎虚线体)

背景需求: 大四班老师要以前的姓名描字帖 【教学类-35-02】20231207大班姓名描字帖:A4单面3*10个姓名,双面共60个名字-CSDN博客文章浏览阅读402次,点赞5次,收藏8次。【教学类-35-02】20231207大班姓名描字帖&#xf…

前端工程化(二)(精品、面试必备基础)(春招、秋招)

目录 什么是模块化?CommonJS规范和Node关系模块化的核心exports 导出 & require 导入模块加载(持续更新) 什么是模块化? 事实上模块化开发最终的目的是将程序划分成一个个小的结构; 这个结构中编写属于自己的逻辑代码,有自己的作用域,…

Python爬虫 Day1

要注意看网页的请求方式是request还是get 一、小型爬虫 (爬百度首页) from urllib.request import urlopen url "https://www.baidu.com" resp urlopen(url) print(resp.read().decode(utf-8)) print("over!") //!&am…

软件杯 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

HarmonyOS鸿蒙开发常用4种布局详细说明

介绍一下鸿蒙开发常用4种布局 1、线性布局 2、层叠布局 3、网格布局 4、列表布局 ​1. 线性布局(Column/Row) 线性布局(LinearLayout)是开发中最常用的布局,通过线性容器Row(行)和Column&…

linux驱动开发面试题

1.linux中内核空间及用户空间的区别? 记住“22”,两级分段两级权限。 例如是32位的机器,从内存空间看:顶层1G是内核的,底3G是应用的;从权限看:内核是0级特权,应用是3级特权。 2.用…

关于Ubuntu虚拟机突然上不了网的问题

今天刚重新把Ubuntu虚拟机下回来准备大干一场,结果去吃饭回来虚拟机就上不去网了,具体体现为右上角没有网络的图标,下图是有网络的情况,废话不多说,直接给出解决方案:博客在此 我就是运行了这三行代码就成功…

记一些有关Element Plus的样式修改

先记一个放着,后续慢慢补充。。。 一个 Vue 3 UI 框架 | Element Plus Radio 单选框 1、去除radio的圆圈 .box-radio {/deep/ .el-radio__input {display: none;} }

jupyter notebook 突然莫名奇妙的白屏

jupyter notebook 突然莫名奇妙的白屏 事件背景: 最近在折腾openai,哎,一言难尽,使用的是conda管理python版本的切换,使用jupyter notebook来运行python程序,其实PyCharm也行,但是,…

python二级备考(2)-简单应用题

第1套 使用turtle库的turtle. right()函数和turtle.fd()函数绘制一个菱形,边长为200像素,4个内角度数为2个60度和2个120度 键盘输入一组人员的姓名、性别、年龄等信息,信息间采用空格分隔,每人一行,空行回车结束录入&a…

【基于HTML5的网页设计及应用】——改变文字和背景颜色

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

如何通过蓝牙获取手机时间同步时钟RTC万年历走ble或者edr经典蓝牙

一、功能简介 KT6368A支持连接手机获取手机的时间信息,可以同步时钟 无需安装任何app,直接使用系统蓝牙即可实现 走的就是edr的经典蓝牙 同时它不影响音频蓝牙,还能保持低功耗的运行 实现的方式就是手机连接好蓝牙芯片KT6368A&#xff0…

Jz32从上往下打印二叉树

//add()和remove()方法在失败的时候会抛出异常(不推荐) // 用offer 和poll 替代 import java.util.ArrayList; import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public …