【LeetCode 113.路径总和 II】 二叉树 vector模拟栈 回溯

在这里插入图片描述
核心是递归程序,这里就放在代码里面讲了

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;
    }
};

有问题欢迎指出。

发布了32 篇原创文章 · 获赞 23 · 访问量 1820

猜你喜欢

转载自blog.csdn.net/qq_45492531/article/details/104278239