递归-二叉树中的剪枝-814.二叉树剪枝-力扣(LeetCode)

个人主页 :1白天的黑夜1-CSDN博客

专栏:力扣刷题录_1白天的黑夜1的博客-CSDN博客企鹅程序员:Linux 系统与网络编程_1白天的黑夜1的博客-CSDN博客

目录

一、题目解析

二、算法原理

解法:递归

1、重复的子问题--设计函数头

2、只关心某一个子问题做什么--设计函数体

3、递归出口

细节:

[根据上面的分析结合自己的思路,先去尝试编写代码,多动手敲代码才能有效提高自己的代码水平。题目链接如下:814. 二叉树剪枝 - 力扣(LeetCode)](#根据上面的分析结合自己的思路,先去尝试编写代码,多动手敲代码才能有效提高自己的代码水平。题目链接如下:814. 二叉树剪枝 - 力扣(LeetCode))

三、代码示例

四、递归展开图

看到最后,如果对您有所帮助,还请点赞、收藏和关注一键三连,在未来还会继续带来优秀的内容,感谢观看,我们下期再见!


一、题目解析

返回移除了所有不包含1的子树的原二叉树这句话不是很好理解,我们可以变成意思相同的另一句话--返回移除了所有只包含0的子树的原二叉树。从示例1我们也能发现,不是只要有0就删掉,子树必须全为0才能剪去。由于是原二叉树,所以我们需要在原二叉树上修改,并返回原本的根节点。

二、算法原理

解法:递归

这个图我们该怎么判断剪枝?

类比后序遍历,左子树,右子树,根的访问顺序。此时左边节点值为0的节点肯定是需要剪枝的,用叶子节点的判断条件+val值为0即可找到要剪枝的节点,并将其修改为nullptr完成剪枝。叶子节点也就是左右子树为空的节点,即root->left == root->right == nullptr。

如果有三个0值节点在同一子树该怎么办?

依旧左子树,右子树,根的处理方式,我们可以发现在把左右子树剪枝后,剩下的根成为了叶子节点,所以可以继续使用之前的剪枝逻辑。

接下来我们根据我们的分析,抽象出递归的三个核心问题

1、重复的子问题--设计函数头

我们需要遍历所有节点判断是否剪枝,所以我们需要一个参数接收传入的根节点,并且我们还需要返回原二叉树,所以还需要一个返回值。函数头类似 Node* f(Node* root)。

2、只关心某一个子问题做什么--设计函数体

2.1、首先我需要去看看我的左子树是否剪枝

2.2、然后我再去看看我的右子树是否剪枝

2.3、最后判断如果我是叶子节点且val值为0,返回nullptr,否则返回root

3、递归出口

由于我们会遍历节点的左右子树,如果遍历的是叶子节点的左右子树,因为是nullptr,所以不用继续向下遍历,所以返回nullptr

细节:

如何保证剪枝成功?

利用递归函数的返回值,假如判断为叶子节点,通过返回值nullptr,将对应的左子树or右子树的值修改,类似 root->left = f(root->left),如果不是叶子节点,返回的也是root->left本身

根据上面的分析结合自己的思路,先去尝试编写代码,多动手敲代码才能有效提高自己的代码水平。题目链接如下:814. 二叉树剪枝 - 力扣(LeetCode)

三、代码示例

cpp 复制代码
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) return nullptr;
        else return root;
    }
};

四、递归展开图

简单模拟一下,感兴趣的读者可以找一张a4纸或者打开画图软件自己动手画一画

看到最后,如果对您有所帮助,还请点赞、收藏和关注一键三连,在未来还会继续带来优秀的内容,感谢观看,我们下期再见!

相关推荐
磊 子15 小时前
STL无序关联容器—unorded_set+unorded_map
开发语言·c++
初夏睡觉15 小时前
数据结构学习之~二叉堆 (P3378 【模版】堆)
数据结构·c++·学习
云泽80816 小时前
笔试算法 - 链表篇(一):移除、反转、合并、回文判断全解析
数据结构·c++·算法·链表
菜菜的顾清寒16 小时前
HOT力扣100(43)二叉树-翻转二叉树
数据结构·算法·leetcode
小poop16 小时前
深入理解指针(中):数组与指针的进阶之旅
c++
朔北之忘 Clancy17 小时前
2026 年 3 月青少年软编等考 C/C++ 一级真题解析
c语言·开发语言·c++·青少年编程·题解·考级
小成2023032026517 小时前
C++~01面向对象基础
开发语言·c++
郝学胜-神的一滴18 小时前
干货版《算法导论》07:递归视角下的选择排序与归并排序
java·数据结构·c++·python·程序人生·算法·排序算法
csdn_aspnet18 小时前
javascript 算法 LeetCode 编号 70 - 爬楼梯
开发语言·javascript·算法·leetcode·ecmascript
Navigator_Z18 小时前
LeetCode //C - 1073. Adding Two Negabinary Numbers
c语言·算法·leetcode