【leetcode】113. 路徑總和 II( Path Sum II )


題目描述

【leetcode】113. 路徑總和 II( Path Sum II )

給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。

說明: 葉子節點是指沒有子節點的節點。

示例:
給定如下二叉樹,以及目標和 sum = 22,

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1

返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

第一次解答

思路
前序遍歷模板上稍微修改即可。
難點是遞歸時怎麼把數據拿出來,兩種方法:

  • 用全局變量。這樣則不考慮數據拿出來的問題
  • 傳指針傳引用。

這裏通過傳指針傳引用的方法拿數據。

代碼:

/**
 * 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:
    void helper(TreeNode* root, int sum, vector<int> one_path, vector<vector<int>> &all_path){
        if(nullptr == root)
            return;
        one_path.push_back(root->val);
        if(sum == root->val && nullptr == root->left && nullptr == root->right){
            all_path.push_back(one_path);
            return;
        }
        else{
            sum -= root->val;
            helper(root->left, sum, one_path, all_path);
            helper(root->right, sum, one_path, all_path);
            return;
        }
    }
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> all_path;
        helper(root, sum, vector<int>(), all_path);
        return all_path;
    }
};

結果:

截圖

第二次解答

上訴代碼中,one_path每次調用便要拷貝一遍,極大浪費空間和時間。看了別人代碼有所啓發,使用vector的pop_back()函數,只採用一個one_path和一個all_path就能實現解答一。

/**
 * 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:
    void helper(TreeNode* root, int sum, vector<int> &one_path, vector<vector<int>> &all_path){
        if(nullptr == root)
            return;
        one_path.push_back(root->val);
        if(sum == root->val && nullptr == root->left && nullptr == root->right){
            all_path.push_back(one_path);
        }
        else{
            sum -= root->val;
            helper(root->left, sum, one_path, all_path);
            helper(root->right, sum, one_path, all_path);
        }
        one_path.pop_back();
        return;
    }
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<vector<int>> all_path;
        vector<int> one_path;
        helper(root, sum, one_path, all_path);
        return all_path;
    }
};

結果:
在這裏插入圖片描述

相關/參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章