题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
自己的思路
由于对路径的概念有点慌张,感觉没啥思路,加上今天笔试了2个小时,果然不适合刷题,还是学习下别人的思路吧,以此作为中秋节之前的最后一道题目了,坚持呗,还能咋地。
大佬的思路
举例:二叉树中有两条和为22的路径:{10,5,7}和{10,12}
本题使用前序遍历的方式访问节点,使用二维向量allRes存储全部路径,使用一维向量tmp存储当前路径。
a.按前序遍历顺序访问每一个节点(不需要额外做什么,按照根、左、右的顺序即可)。
b.访问每个结点时,将结点添加到路径向量tmp中。如果当前结点是叶子结点,则判断当前路径是否是符合条件的路径,符合条件的路径存入到二维向量result;如果当前结点不是叶子结点,则递归当前节点的左右子节点。(用了两个vector)
c.每次到一次叶子节点后,都要回到父节点,通过vector的pop_back()实现。
上代码
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber){
if(root) dfsFind(root, expectNumber);
return allRes;
}
void dfsFind(TreeNode * node , int target){ //target是剩余的路径值
tmp.push_back(node->val);
if(!node->left && !node->right){ //node为叶子节点
if(target - node->val == 0)
allRes.push_back(tmp); //剩余的路径值为0,且是叶子节点,为一条路径
}
else{
if(node->left) dfsFind(node->left, target - node->val); //判断左边是否有路径
if(node->right) dfsFind(node->right, target - node->val); //判断右边是否有路径
}
if(!tmp.empty()) //这里很关键,回到当前节点的父节点
tmp.pop_back();
}
private:
vector<vector<int> > allRes;
vector<int> tmp;
};