核心是递归程序,这里就放在代码里面讲了
class Solution {
public:
void dfs(TreeNode*root,int sum, vector<vector<int> >&a,int cur,vector<int>&item,TreeNode*pre )//item作为一维数组存当前遍历到的value,pre指针指向当前结点的父结点。
{
if(!root) //递归出口,已经递归到空结点了
{
if(cur==sum&&!pre->right){ //为空有两种情况,一个是叶结点只有右分支而没有左分支,另一种是到底了,前者不算一个完整路径,故不算。
a.push_back(item); //满足以上就把当前数组push进a中
}
return ; //返回,递归出口
}
item.push_back(root->val); //每次的递归,类似先序遍历,把当前的val先存起来
dfs(root->left,sum,a,cur + root->val,item,root);
if(root->right) //到底之后为了不重复进入递归出口,所以只需要走一个左分支就行了,右边只需要有值的时候才走
dfs(root->right,sum,a,cur + root->val,item,root);
item.pop_back(); //回溯,恢复前一个状态
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > a;
if(!root) return a; //根结点为空的情况直接返回空数组
int cur = 0; //初始化
vector<int> item;
TreeNode *pre = NULL;
dfs(root,sum,a,cur,item,pre); //深搜
return a;
}
};
有问题欢迎指出。