Leetcode 113. 路徑總和 II dfs
阿新 • • 發佈:2018-12-24
給定一個二叉樹和一個目標和,找到所有從根節點到葉子節點路徑總和等於給定目標和的路徑。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定如下二叉樹,以及目標和 sum = 22
,
5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1
返回:
[ [5,4,11,2], [5,8,4,5] ]
思路很簡單,就是往下搜尋,但是寫起來比較難。。。
這裡貼一下我第一次瞎寫的程式碼:
C++:
/** * 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: vector<vector<int>> pathSum(TreeNode* root, int sum) { vector<vector<int>> ve; vector<int> v1; if(root==NULL) return ve; dfs(0,sum,root,ve,v1); return ve; } void dfs (int sum,int target,TreeNode* root,vector<vector<int>>& ve,vector<int>& v1) { if(root==NULL) return; if(root->left==NULL&&root->right==NULL) { if(sum+root->val==target) { v1.push_back(root->val); ve.push_back(v1); v1.pop_back(); } return ; } v1.push_back(root->val); dfs (sum+root->val,target,root->left,ve,v1); dfs (sum+root->val,target,root->right,ve,v1); v1.pop_back(); } };
然後笨笨的我看了別人的程式碼,自己按照思路寫了一遍, 成功超過了100% 的樣例。 。。
改進後的程式碼:
C++:
/** * 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: vector<vector<int>> pathSum(TreeNode* root, int sum) { vector<vector<int>> ve; vector<int> v1; if(root==NULL) return ve; v1.push_back(root->val); dfs (root,sum,root->val,ve,v1); return ve; } void dfs (TreeNode* root,int target,int sum,vector<vector<int>>& ve,vector<int>& v1) { vector<int>v2=v1; if(root->left==NULL&&root->right==NULL&&sum==target) { ve.push_back(v2); return; } if(root->left) { v1.push_back(root->left->val); dfs (root->left,target,sum+root->left->val,ve,v1); } if(root->right) { v2.push_back(root->right->val); dfs (root->right,target,sum+root->right->val,ve,v2); } } };