【Leetcode每日一题】 递归 - 求根节点到叶节点数字之和(难度⭐⭐)(50)

news/2024/7/20 22:37:54 标签: leetcode, 算法, 职场和发展, c++, 深度优先

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.niftyadmin.cn/n/5470699.html

相关文章

逆向基础之数据类型

不同的数据在内存中的存放方式是不同的,我们说内存中每一位只存放了0和1,用来表示整数很容易 例如00000011表示3。 那怎么表示小数怎么表示文字符号呢? 因为我们知道内存里是没有小数点没有文字的。 这就需要不同的存放方式,用…

Python数据分析与可视化笔记 九 分类问题

分类 分类是找出数据库中一组数据对象的共同特点,并按照分类模式将其划分为不同的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别。 分类学习是一类监督学习的问题,训练数据会包含其分类结果,根据分…

代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

文章目录 前言1、Bluecms-CNVD-1Day-常规注入审计分析2、emlog-CNVD-1Day-常规注入审计分析3、emlog-CNVD-1Day-2次注入审计分析 前言 挖掘技巧: -语句监控-数据库SQL监控排查可利用语句定向分析 -功能追踪-功能点文件SQL执行代码函数调用链追踪 -正则搜索-(update…

备考2024年思维100春季线上比赛?来做做官方模拟题(附答案)

2024年春季思维100活动第一阶段线上比赛(4月20日,星期六,上午)的报名正在进行中,更多安排和需要提前了解的关键点可以见我前面写的文章,或者直接联系我获取相关资料。 【提醒】2024年春季的思维100在线比赛…

LeetCode每日一题之专题一:双指针 ——快乐数

快乐数OJ链接:202. 快乐数 - 力扣(LeetCode) 题目: 题目分析: 为了房便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平方和」这⼀个 操作记为 x 操作; 题目告诉我们&#…

openEuler本地构建RPM包实战(七)——常见报错及解决措施

2.7 常见报错及解决措施 (1)源代码文件找不到 报错现象:执行 rpmbuild -ba rpmbuild/SPECS/curl.spec 命令后,报如下错误:error: Bad source: /root/rpmbuild/SOURCES/curl-8.4.0.tar.xz: No such file or directory [root@localhost ~]# rpmbuild -ba rpmbuild/SPECS/c…

Python 使用matplotlib创建各种静态、动态、交互式和3D图表的功能

在Python中,你可以使用各种库来创建和显示图表。其中,最常用的库之一是matplotlib,它提供了创建各种静态、动态、交互式和3D图表的功能。另一个流行的库是seaborn,它基于matplotlib,并提供了更高级别的界面&#xff0c…

Unity开发者3D模型基础

术语“3D 建模”是指使用特殊软件创建对象或表面的 3D 数字表示的过程。 3D 模型可用于各种不同的目的,包括电影、视频游戏、建筑和工程。 3D 建模也是创建虚拟现实 (VR) 和增强现实 (AR) 体验工作的重要组成部分。 我们通常通过构建或获取 3D 模型并将其导入 Unit…