【Leetcode每日一题】 递归 - 二叉树剪枝(难度⭐⭐)(50)

news2025/4/8 19:20:21

1. 题目解析

题目链接:814. 二叉树剪枝

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

想象一下,你有一堆层层叠叠的积木,你想从底部开始,把那些标记为0的积木拿走。如果直接从上面开始拿,你可能会碰到很多麻烦,因为你不知道下面的积木长什么样,也不敢轻易动它们。但是,如果你从最下面的积木开始,一层一层往上拿,事情就变得简单多了。

这就像我们处理二叉树一样。如果从上往下删除节点,我们就需要知道左右子树的情况,这确实是个头疼的问题。但反过来,如果我们从下往上,也就是从最底层的叶子节点开始,删除那些值为0的叶子节点,然后再处理上一层,这样问题就简单多了。

具体来说,我们可以采用后序遍历的方法。后序遍历就是先处理左子树,再处理右子树,最后处理当前节点。当我们处理到当前节点时,只要判断它是不是叶子节点,并且值是不是0,如果是的话,就直接删除它。

不过要注意,当我们删除一个叶子节点后,它的父节点可能就变成新的叶子节点了。所以,处理完当前节点后,我们还需要检查它的父节点是否需要处理。这就是为什么我们选择后序遍历的原因,因为后序遍历最先遍历到的总是叶子节点。

算法流程可以这样描述:

  1. 定义一个递归函数dfs(TreeNode*& root),这个函数会检查当前节点是否需要删除。

  2. 递归的出口:如果传入的节点为空,那么直接返回,不需要做任何处理。

  3. 递归处理左右子树:先调用dfs函数处理左子树,再处理右子树。

  4. 处理当前节点

    • 判断当前节点是否已经是叶子节点(即左右子节点都被删除了),并且节点的值为0。
    • 如果是的话,就删除这个节点。
    • 如果不是,就保持原样,不做任何处理。

通过这样的方式,我们可以从底部开始,逐步删除值为0的叶子节点,并且保证删除后的树仍然满足我们的要求。当所有的叶子节点都被检查并处理完毕后,如果它们的值都是1,那就说明整棵树都包含1,此时我们就可以返回结果了。

这种方法的好处是,它让删除操作变得相对简单,而且不会影响最终的结果。就像我们一层一层地拿走积木,最后留下的都是我们想要的。

3.代码编写

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

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

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

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

相关文章

如何在Flutter应用中配置ipa Guard进行混淆

在移动应用开发中,保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具,帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆,并提供了相关的操作步骤和注意事项。 📝 摘要 本…

【行业资讯】AI算力的需求推动光模块行业快速迭代

近期,由OpenAI发布的人工智能文生视频大模型Sora再次引起了不小的轰动,继ChatGPT之后,Sora的推出让AIGC(生成式人工智能)再度成为行业焦点,AI大模型的快速迭代升级对网络架构提出了更高要求,推动…

GlusterFS分布式存储

目录 前言 一、GlusterFS分布式存储概述 1、GFS概念 2、GFS特点 3、GFS术语 4、GFS构成 5、GFS工作流程 6、后端存储如何定位文件 7、GlusterFs的卷类型 7.1 Distributed Volume(分布式卷) 7.2 Striped Volume(条带卷&#xff09…

项目实战 | 使用python分析Excel销售数据(用groupby)

项目实战 | 使用python分析Excel销售数据 本文目录: 零、00时光宝盒 一、提出问题 二、理解数据 2.1、安装python读取excel文件的库 2.2、查看excel表的字段名和前几行记录 2.3、查看excel表结构 2.4、查看索引 2.5、查看每一列的列表头内容 2.6、查看每一…

SpringBoot中application.yml引入多个YML文件

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等)…

[数据结构]栈和队列结构的简单制作

一、栈 1.1栈的概念以及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。 栈中的数据元素遵守后进先出LIFO(Last In First Out)的原…

yolov7的改进工地安全帽佩戴检测系统-协同双注意力机制CDAM2(教程+代码)

研究的背景和意义 随着工业化和城市化的快速发展,建筑工地的安全问题日益凸显。在建筑工地中,工人的安全是至关重要的,而工地安全帽的佩戴是保障工人安全的重要措施之一。然而,由于工地环境复杂多变,工人的佩戴情况往…

网络安全之权限维持那点事

权限维持 一旦黑客成功地入侵了目标系统,他们通常会尝试保持对系统的持久访问权,以便继续执行恶意活动,如窃取敏感数据、植入恶意软件、破坏系统功能等。 权限维持的过程可能包括以下几个方面: 后门植入:黑客可能会在…

蓝桥杯单片机要点——第十二届省赛(含代码)

题目: 用到的模块: LED单个点亮(建议用sbit,文件开头定义单个引脚) 数码管动态显示 矩阵键盘 ds18b20,用到onewire.c DAC转化(步骤见文章末尾的易错点),用到iic.c m…

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中,人工智能(AI)已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航,AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展,我们正站在一个新的转折点上&#xff…

Playwright安装和基本使用(ui/web自动化)

1.简介 Playwright是2021年微软开源的一个项目「playwright-python」。针对 Python 语言的纯自动化工具,它可以通过单个API自动执行 Chromium,Firefox 和 WebKit 浏览器,同时支持以无头模式、有头模式运行。 Playwright(Git&…

美国CPC认证是什么认证

美国CPC认证是一种针对儿童产品的认证,旨在确保这些产品的安全性。CPC全称为Consumer Product Certification,即消费品认证,是美国消费品安全委员会(CPSC)所推行的一种自愿性认证制度。通过CPC认证的产品,意…

人证比对接口在游戏行业的作用

人证比对接口又叫实人认证接口、人脸身份证比对接口、人脸实名认证接口,这个接口在很多行业都有重大作用,特别是确认当前用户信息至关重要。今天我们来聊一聊实人认证接口在游戏行业的作用。 今天为什么聊这个话题呢,主要就是最近热搜都被杭…

AR远程空间标注Vuforia+WebRTC音视频通话和空间标注功能

AR远程空间标注VuforiaWebRTC音视频通话和空间标注功能 视频学习地址:https://www.bilibili.com/video/BV1ZT4y187mG/?vd_sourcefc4b6cdd80b58c93a280fd74c37aadbf

LeetCode110:平衡二叉树

题目描述 给定一个二叉树,判断它是否是 平衡二叉树 解题思想 使用递归依次计算左子树的高度和右子树的高度 代码 class Solution { public:int height(TreeNode* node) {if (node nullptr) return 0;int leftT height(node->left);if (leftT -1) return -1;…

武汉星起航:亚马逊助力中国卖家拓展全球市场,实现品牌价值最大化

亚马逊,作为全球电商的领军平台,不仅为消费者提供了丰富的购物选择,同时也为中国卖家带来了前所未有的益处和在中国市场的巨大优势。 亚马逊为中国卖家提供了一个全球化的销售平台。这个平台不仅连接了中国与世界的消费者,还为中…

标准C库文件操作

open 系列API 和 fopen系列API的区别 1.来源: -open 是UNIX系统调用函数(包括LINUX系统),返回的是文件描述符 -fopen是ANSIC标准的C语言库函数,在不同系统重调用不同内核的API 2.移植性: fopen 是C标准函数,具有良好的移植性; 而…

Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive简单使用

一、需求 产品要求:Vue移动端项目进入列表页,列表页需要刷新,而从详情页返回列表页,列表页则需要缓存并且还原页面滚动条位置 二、实现思路 1、使用Vue中的keep-alive组件,keep-alive提供了路由缓存功能 2、因为我项…

基于知识图谱的推理:智能决策与自动发现

基于知识图谱的推理:智能决策与自动发现 一、引言 在今天这个数据驱动的时代,我们经常会听到人们提及“知识图谱”这个词。知识图谱,作为一种结构化知识的表达方式,已经成为智能系统不可或缺的一部分,它通过连接大量的…

ModuleNotFoundError: No module named ‘mlxtend‘

from mlxtend.plotting import plot_decision_regions 报错信息: ModuleNotFoundError: No module named mlxtend Jupyter和Spyder报错原因:因为anaconda下没有这个模块,需要安装mlxtend 解决方案: 1.打开anaconda(或终端) 2. 点击路径点…