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.嗟食

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

期待与佬的再次相遇~

相关推荐
weixin_307779131 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
Frank_refuel4 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
海绵宝宝转agent5 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
每天都要写算法(努力版)5 小时前
【行业前沿报告】DAgger:让智能体在自己走到的状态上学习
人工智能·学习·机器学习
hetao17338376 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6267 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan7 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356388 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah9 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO99 小时前
指针的算术运算详解
java·数据结构·算法