🔥近津薪荼: [个人主页] 🎬个人专栏: 《近津薪荼的算法日迹》 《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来接受返回值
我们来分析问题:
- 重复子问题:记录每一层子树的路径
- 子问题要做的事:记录路径,直到叶子结点,将记录的路径放到ret中
- 出口:空节点
重点就在于,怎么设计函数头
怎么去维护path这个信息
我们尝试使用全局变量,那么函数头只有一个参数:root;
我们来模拟遍历过程:

遍历过程中有个小细节:每一步在记录当前节点数据之后需要加一个小箭头,除了叶子结点。
我们发现,在遍历完4,回溯的时候,为了方便记录向2的右子树遍历的路径,我们不得不把之前记录的path中的4删去,也就是说,我们每一次回溯都要删除前一次记录的数据。
我们把回溯过程中删除上一次操作产生的影响删去,数据恢复成原先的状态的操作叫做恢复现场
有的时候,回复现场的操作会显得很多余 ,但有点时候也是必要 的(比如全局变量的优势不可替代的时候),很多时候都是这样,对人对事,两害取其轻罢了。
我们这题比较简单,完全可以省去这多余的一步操作~
怎么省?
4.2函数传参传递信息
使用函数传参(传值),参数传入后,都是由函数内部的局部变量,接受传来的值进行操作,它们的生命周期只在本次调用函数期间存在,退出调用,path还是调用函数之前的样子,也就不必再做恢复现场的操作啦~,退出函数就是原现场!不会影响后边的操作
这样的话函数头就有两个参数,root以及path
大家回头两种方法可以都试一试
5.下期要讲解的题目是:
全排列
6.嗟食
如果小编写的内容对佬有帮助,还请大佬点点三连加关注哦 
佬的支持就是我前进的最大动力
~
期待与佬的再次相遇~