[leetcode 113] 路径总和 II

题目:https://leetcode.cn/problems/path-sum-ii/description/

在这里插入图片描述

这道题目是二叉树的经典回溯题目。既然要博爱村路径,那就得前序(中左右)递归遍历,代码如下:

有几个细节需要注意:

  • 因为节点的值可能是负值,所以必须要遍历到叶节点才行,无法剪枝;
  • 路径参数 path 采用地址传参,无需复制,但是要加上 pop_back 才行;
  • 找到答案后,不要忘了 pop_back,因为下面直接返回了。
class Solution {
    
    
public:
    vector<vector<int>> ans;
    void backtracking(TreeNode* root, vector<int>& path, int target) {
    
    
        if (!root) {
    
    
            return;
        }
        // 访问根节点
        path.push_back(root->val);
        target -= root->val;
        // 判断
        if (target == 0 && !root->left && !root->right) {
    
    
            ans.push_back(path);
            // 不要忘记出栈
            path.pop_back();
            return;
        }
        backtracking(root->left, path, target);
        backtracking(root->right, path, target);
        path.pop_back();
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
    
    
        vector<int> path;
        backtracking(root, path, targetSum);
        return ans;
    }
};

下面的代码不使用地址传参,而是复制传参,这样就不需要 pop_back 操作了,同样可以ac,但是速度和内存性能都比较差

class Solution {
    
    
public:
    vector<vector<int>> ans;
    void backtracking(TreeNode* root, vector<int> path, int target) {
    
    
        if (!root) {
    
    
            return;
        }
        path.push_back(root->val);
        target -= root->val;
        if (target == 0 && !root->left && !root->right) {
    
    
            ans.push_back(path);
            // path.pop_back();
            return;
        }
        backtracking(root->left, path, target);
        backtracking(root->right, path, target);
        // path.pop_back();
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
    
    
        vector<int> path;
        backtracking(root, path, targetSum);
        return ans;
    }
};

思考:如果仅要求找到任意一条符合条件的路径,这样如何剪枝呢?

猜你喜欢

转载自blog.csdn.net/weixin_43742643/article/details/128600339