LeetCode---Path Sum II

来源:互联网 发布:c语言输出*等腰三角形 编辑:程序博客网 时间:2024/06/06 09:11

题目大意:给出一个二叉树和一个从根节点到叶子节点的路径和,找出二叉树中所有满足要求的路径。

算法思想:

先序遍历整个二叉树,遍历的同时记录下当前所遍历过的节点,及当前路径和,当遍历到根节点时判断路径和是否满足要求,若不满足,则从路径节点中移除该节点同时路径和也相应的减少,如果满足要求则记录下当前路径,同时设置回溯标记以便来记录下一条满足要求的路径,按照此过程直到整个二叉树遍历结束。

说明: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;    }};


0 0
原创粉丝点击