dfs专题6——二叉树的所有路径

🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日迹》 《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 {
    int ret,count;
public:
    int kthSmallest(TreeNode* root, int k) {
        count =k;
        dfs(root);
        return ret;
    }
    void dfs(TreeNode* root)
    {
        if(root==nullptr)return ;//出口

        if(count ==0) return; //剪枝,知道没结果,就不开始遍历了
        dfs(root->left);

        if(--count ==0)
        {
            ret=root->val;
            return ;
        }

        if(count ==0) return; //剪枝,知道没结果,就不开始遍历了
        dfs(root->right); 
    }
};

2.本期知识点导图

3.本期要讲解的题目是

二叉树的所有路径

要点:

  • 常规题,按照根左右的前序遍历即可
  • 要点在于,如何传递信息?

之前我们讲到信息传递的方式有3种,

  • 信息自上而下用函数参数(传值)
  • 自下而上用返回值
  • 还有全局变量记录数据

其中函数参数,传引用和传地址的方式就不说了,基本上用不到,既不能发挥传值传参的数据独立性的优势,也不能发挥全局变量的复杂逻辑模块化的优点,除非一些特殊情况,我们基本上不会去用这俩。

本题信息很显然是自上而下的,因为记录下一个路径的时候,必然要和前边的路径相结合。

那就是要从传值传参和全局变量中选一个作为信息传递的方式。

4.解题

4.1 全局变量传递信息:

首先,不管是哪种传递信息的方式,都要创建一个数组ret来接受返回值

我们来分析问题:

  1. 重复子问题:记录每一层子树的路径
  2. 子问题要做的事:记录路径,直到叶子结点,将记录的路径放到ret中
  3. 出口:空节点

重点就在于,怎么设计函数头
怎么去维护path这个信息

我们尝试使用全局变量,那么函数头只有一个参数:root;

我们来模拟遍历过程:

遍历过程中有个小细节:每一步在记录当前节点数据之后需要加一个小箭头,除了叶子结点

我们发现,在遍历完4,回溯的时候,为了方便记录向2的右子树遍历的路径,我们不得不把之前记录的path中的4删去,也就是说,我们每一次回溯都要删除前一次记录的数据。

我们把回溯过程中删除上一次操作产生的影响删去,数据恢复成原先的状态的操作叫做恢复现场

有的时候,回复现场的操作会显得很多余 ,但有点时候也是必要 的(比如全局变量的优势不可替代的时候),很多时候都是这样,对人对事,两害取其轻罢了。

我们这题比较简单,完全可以省去这多余的一步操作~

怎么省?

4.2函数传参传递信息

使用函数传参(传值),参数传入后,都是由函数内部的局部变量,接受传来的值进行操作,它们的生命周期只在本次调用函数期间存在,退出调用,path还是调用函数之前的样子,也就不必再做恢复现场的操作啦~,退出函数就是原现场!不会影响后边的操作

这样的话函数头就有两个参数,root以及path

大家回头两种方法可以都试一试

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

全排列

6.嗟食

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

期待与佬的再次相遇~

相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
fpcc5 小时前
并行编程实战——CUDA编程的Parallel Task类型
c++·cuda
偷吃的耗子5 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
今天只学一颗糖5 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
testpassportcn6 小时前
AWS DOP-C02 認證完整解析|AWS DevOps Engineer Professional 考試
网络·学习·改行学it
化学在逃硬闯CS6 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1236 小时前
C++使用format
开发语言·c++·算法
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
lanhuazui107 小时前
C++ 中什么时候用::(作用域解析运算符)
c++
charlee447 小时前
从零实现一个生产级 RAG 语义搜索系统:C++ + ONNX + FAISS 实战
c++·faiss·onnx·rag·语义搜索