1. 程式人生 > >Leetcode: 113. Path Sum II (week3 --- medium)

Leetcode: 113. Path Sum II (week3 --- medium)

題目 

題解

總結


題目 

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

Note: A leaf is a node with no children.

題目給出了一個例子:

 所以也就是相當於尋找一條從根root開始的到葉節點的路徑,這一條路徑需要滿足和為題目中所要求的數字。

其中葉節點的要求是:沒有任何的子節點。這是其中一個比較坑的地方

題解

  1. 因為這裡要求的是從根節點出發的,需要將樹遍歷一次,根據樹的遍歷演算法,有:前序遍歷、中序遍歷、後序遍歷三種遍歷方式。而這裡要求的是從根節點開始,所以不難知道使用前序遍歷的遞迴思想是比較容易實現的
  2. 這裡可以給solution定義一個私有變數,sum,也就是目的要求的總和。這樣就能夠減少函式的引數。
  3. 以前序遍歷作為主體,改造其為如下,其中root也就是當前遍歷到的節點,而current則是用來記錄當前路徑的,result則是最後的返回值,current_sum則是用來記錄當前的總和值。
  4. void preorder(TreeNode* root, vector<int>& current,vector<vector<int>>& result, int current_sum);

    在sum與current_sum相等的時候,還需要判斷最後的節點是不是葉節點,若是則是符合的路徑,所以程式碼如下:

if(current_sum == sum && root->left == NULL && root->right == NULL){
      result.push_back(current);
}

所以總的程式碼如下:

class Solution {
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        this->sum = sum;
        vector<int> current;
        vector<vector<int>> result;
        if(root == NULL){
            return result;
        }
        int current_sum = root->val;
        current.push_back(root->val);
        if(current_sum == sum && root->left == NULL && root->right == NULL){
            result.push_back(current);
        }
        preorder(root->left, current, result, current_sum);
        preorder(root->right, current, result, current_sum);
        current.pop_back();
        return result;
    }

    void preorder(TreeNode* root, vector<int>& current,vector<vector<int>>& result, int current_sum){
        if(root == NULL){
            return ;
        }
        current_sum+=root->val;

            current.push_back(root->val);
            if(current_sum == sum && root->left == NULL && root->right == NULL){
                result.push_back(current);
            }
            preorder(root->left, current, result, current_sum);
            preorder(root->right, current, result, current_sum);
            current.pop_back();
    }
private:
    int sum;
};

總結

覺得在學習DFS與BFS的時候實際上很多是跟樹的遍歷方式很相似,只不過樹的遍歷是一種特殊情況,不需要進行標記操作。所以這些知識是可以互通。