Leetcode: 113. Path Sum II (week3 --- medium)
阿新 • • 發佈:2018-11-10
題目
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開始的到葉節點的路徑,這一條路徑需要滿足和為題目中所要求的數字。
其中葉節點的要求是:沒有任何的子節點。這是其中一個比較坑的地方
題解
- 因為這裡要求的是從根節點出發的,需要將樹遍歷一次,根據樹的遍歷演算法,有:前序遍歷、中序遍歷、後序遍歷三種遍歷方式。而這裡要求的是從根節點開始,所以不難知道使用前序遍歷的遞迴思想是比較容易實現的
- 這裡可以給solution定義一個私有變數,sum,也就是目的要求的總和。這樣就能夠減少函式的引數。
- 以前序遍歷作為主體,改造其為如下,其中root也就是當前遍歷到的節點,而current則是用來記錄當前路徑的,result則是最後的返回值,current_sum則是用來記錄當前的總和值。
-
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的時候實際上很多是跟樹的遍歷方式很相似,只不過樹的遍歷是一種特殊情況,不需要進行標記操作。所以這些知識是可以互通。