Leetcode:113. 路徑總和II
阿新 • • 發佈:2018-11-13
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
解題思路:
解題思路與Leetcode:112.路徑總和,一致,只不過要儲存已訪問的路徑,注意事項:最好將路徑陣列,當前的和,設定為類的成員,已避免在DFS函式中重複建立。一般而言,建立一個變數、陣列要比修改它們更加耗時。
https://blog.csdn.net/qq_23523409/article/details/83750939
#define hasLChild(x) (!(x->left==NULL)) #define hasRChild(x) (!(x->right==NULL)) #define hasNoChild(x) (!hasLChild(x)&&!hasRChild(x)) class Solution { public: vector<vector<int>> pathSum(TreeNode* root, int sum) { if (root == NULL) return{}; _sum = sum; DFS(root); return res; } void DFS(TreeNode* root) { if (hasNoChild(root)) { if (root->val == _sum) { road.push_back(root->val); res.push_back(road); } return; } road.push_back(root->val); int size = road.size(); _sum -= root->val; int sgn = _sum; if (hasLChild(root)) DFS(root->left); road.erase(road.begin() + size, road.end()); _sum = sgn; if (hasRChild(root)) DFS(root->right); } private: vector<vector<int>> res; int _sum; vector<int> road; }; |