dfs专题——二叉树的深搜3(二叉树剪枝)

🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日记》 《Linux操作系统及网络基础知识分享》 《c++基础知识详解》 《c语言基础知识详解》


1.上期参考代码

cpp 复制代码
/**
 * 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:
    int sumNumbers(TreeNode* root) {
      return dfs(root,0);
    }
    int dfs(TreeNode* root, int prenum)
    {
        if (root == nullptr) return 0;//提给的是非空树,但是子树不一定非空
        int num =prenum*10+root->val;//求和数
        if(root->left==nullptr&&root->right==nullptr)
        return num;//出口
        return dfs(root->left,num)+dfs(root->right,num);
    }
};

2.本期知识点导图

# 3.本期要讲解的题目是 ## [二叉树剪枝](https://leetcode.cn/problems/binary-tree-pruning/)

要点:

  • 题目意思要删除纯0的子树

本题的剪枝不是我们算法策略中的剪枝 ,它意思是单纯地给树剪掉纯0的"树枝"

4.解题

分析

我们要知道子树是不是纯0子树,那肯定是要遍历子树了,分析一下遍历方式:肯定是后续遍历,先处理左子树,再处理右子树,然后才能处理根,上来还没看子树先把根掐断了肯定不行~

下面来模拟一下遍历过程,找到递归的三个问题:

重复子问题、子问题干什么、递归出口

模拟:

模拟的过程中要注意:

我们递归的问题是一个个子问题 ,相同的结构都要走一遍的,所以:
叶子结点也要遍历的,我们处理的情况要包含叶子结点这个特殊情况,我们设计函数头,函数体,往往还真就在叶子结点上做文章。

  • 观察后序遍历,寻找出口开始递归的地方):叶子结点的左右子结点与非叶子结点的空子节点------空节点
  • 找到出口之后,我们再看遍历的过程 ,找到子问题要干什么,我们看最左子树的第一个纯0子树,即左叶子结点,我们发现它有这样的特点:左右子节点都是空,自己的值是0,这样的子树我们要剪掉它

那么问题来了,剪枝操作具体怎么做?

同链表结点的增删一样,无非是改变指针的指向:剪掉它,相当与让父节点指向它的指针指向空,它自然就没了

很显然,我们需要一个桥梁链接父子节点之间的关系:函数的返回值或者参数,这里用返回值更合理,因为我们递推下来之后,是要把下边的情况返回给父级,比如,空结点,或者非空,但是值为0且左右子树是空,这两种情况应该告诉父级:你可以把指向我的指针置空了(返回空指针,直接让父级指向它的指针指向它返回的空即可)

总结规律:在二叉树的bfs中,信息需要从上至下传递的话,用函数参数传递,反之则用返回值

总结一下:

代码逻辑

- 重复子问题:剪枝

- 子问题具体干啥:后序遍历传信息,判断信息做剪枝

- 出口:空节点

5.下期要讲解的题目是:

验证二叉搜索树

6.嗟食

如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦
佬的支持就是我前进的最大动力 ~

相关推荐
wuweijianlove2 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
研究点啥好呢2 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
沫璃染墨2 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
黎阳之光3 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_113 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia3 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
_李小白3 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
wfbcg3 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展