题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路:
使用dfs进行判断,使用expNum记录当前剩余的值,使用vector来记录到达当前节点的路径中各个节点,在回溯的时候需要删掉最后加入的当前节点,找到一条路径的条件是节点为叶子,且剩余值等于当前节点值。还有比较坑的是,讨论区里很多答案貌似忘记了最后要求数组长度大的靠前的条件,笔者在最后又使用sort排序了一遍结果。
bool cmp(const vector<int> &a, const vector<int> &b){
return a.size() > b.size();
}
class Solution {
public:
vector<vector<int> >res;
void dfs(TreeNode*root, int expNum, vector<int>vct){
if(root == NULL) return;
if(root->val > expNum){
return;
}
if(root->left == NULL && root->right == NULL && root->val == expNum){
//找到一条路径
vct.push_back(root->val);
res.push_back(vct);
vct.pop_back();
return;
}
if(root->left != NULL){
vct.push_back(root->val);
dfs(root->left, expNum-root->val, vct);
vct.pop_back();
}
if(root->right != NULL){
vct.push_back(root->val);
dfs(root->right, expNum-root->val, vct);
vct.pop_back();
}
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<int> vct;
dfs(root, expectNumber, vct);
sort(res.begin(), res.end(), cmp);
return res;
}
};