DFS深度优先搜索
深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.
深度优先搜索一般用于树或者图的遍历,其他有分支的(如二维矩阵)也适用。它的原理是从初始点开始,一直沿着同一个分支遍历,直到该分支结束,然后回溯到上一级继续沿着一个分支走到底,如此往复,直到所有的节点都有被访问到。
基本思路
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
解决 JZ34
二叉树中和为某一值的路径(二)
题目链接

根节点开始向左右子树进行递归,由于要返回具体的路径,递归函数中需要处理的是:
- 当前的路径
path
要更新
- 当前的目标值
expectNumber
要迭代,减去当前节点的值
- 若当前节点是叶子节点,考虑是否满足路径的期待值,并考虑是否将路径添加到返回列表中(和之前二叉树中和为某一值的路径(一)不同需要加入返回列表)
tips:下面回溯与之前一般的分治解决问题的区别在于,使用了全局变量保留路径(当然也可以借助传引用保留,主要是要跨递归不能是局部变量)。且会有清理全局变量即清理现场的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
#include <cstdio> class Solution { public:
vector<int> path; vector<vector<int> > FindPath(TreeNode* root, int target) { vector<vector<int> > ret; if(root==nullptr) return ret; dfs(ret,root,target); return ret; } void dfs(vector<vector<int> > &retpaths,TreeNode* root, int target){ target-=root->val; path.emplace_back(root->val); if(root->left==nullptr&&root->right==nullptr&& target==0){ retpaths.push_back(path); } if(root->left!=nullptr) dfs(retpaths,root->left,target); if(root->right!=nullptr) dfs(retpaths,root->right,target); path.pop_back(); }
};
|