题目大意:给出一个二叉树和一个从根节点到叶子节点的路径和,找出二叉树中所有满足要求的路径。
算法思想:
先序遍历整个二叉树,遍历的同时记录下当前所遍历过的节点,及当前路径和,当遍历到根节点时判断路径和是否满足要求,若不满足,则从路径节点中移除该节点同时路径和也相应的减少,如果满足要求则记录下当前路径,同时设置回溯标记以便来记录下一条满足要求的路径,按照此过程直到整个二叉树遍历结束。
说明:1.先序遍历设置的栈中节点存放当前节点和它的父亲节点。2.取栈顶元素后,若遇到回溯标记则将记录大路径回溯到当前节点的父亲节点。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > res;
if(root==NULL) return res;
vector<int> tmp;
vector<TreeNode*> nodes;
stack<pair<TreeNode*,TreeNode*> > S;
bool flag=false;
int node_sum=0;
pair< TreeNode*, TreeNode*> cur;
S.push(make_pair(root,( TreeNode*)NULL));
while(!S.empty()){
cur=S.top();
S.pop();
if(flag){
while(cur.second!=nodes.back()){
node_sum-=tmp.back();
nodes.pop_back();
tmp.pop_back();
}
flag=false;
}
tmp.push_back(cur.first->val);
nodes.push_back(cur.first);
node_sum+=cur.first->val;
if(cur.first->right==NULL&&cur.first->left==NULL){
if(node_sum==sum)
res.push_back(tmp);
tmp.pop_back();
nodes.pop_back();
node_sum-=cur.first->val;
flag=true;
}
if(cur.first->right!=NULL)
S.push(make_pair(cur.first->right,cur.first));
if(cur.first->left!=NULL)
S.push(make_pair(cur.first->left,cur.first));
}
return res;
}
};