437. Path Sum III
2016-10-29 20:18
330 查看
这道题可以借用之前112. Path Sum的思想,不过它需要两层深度优先遍历。
先从头结点开始遍历,求得满足条件的路径的个数后,再分别遍历其左右子树,求得满足条件的路径再累加。
第一种方法:用队列层次遍历树的每个节点,再从每个节点开始dfs求出满足条件的路径,将所有的累加就得到结果。
class Solution { public: int pathSum(TreeNode* root, int sum) { if(root==NULL) return 0; queue<TreeNode*> q_tree; q_tree.push(root); int num_total=0; while(!q_tree.empty()) { TreeNode *temp=q_tree.front(); q_tree.pop(); int num=0; dfs(temp,sum,num); num_total+=num; if(temp->left) q_tree.push(temp->left); if(temp->right) q_tree.push(temp->right); } return num_total; } void dfs(TreeNode *root,int sum,int &num) { if(!root) return; else { if(root->val==sum) num++; dfs(root->left,sum-root->val,num); dfs(root->right,sum-root->val,num); } } };
另外两种写法,比较简单
class Solution { public: int pathSum(TreeNode* root, int sum) { if(root==NULL) return 0; return dfs(root,sum)+pathSum(root->left,sum)+pathSum(root->right,sum); } int dfs(TreeNode *root,int sum) { int ret=0; if(root==NULL) return ret; if(root->val==sum) ret++; ret+=dfs(root->left,sum-root->val); ret+=dfs(root->right,sum-root->val); return ret; } };
class Solution { public: int pathSum(TreeNode* root, int sum) { if(root==NULL) return 0; return dfs(root,sum)+pathSum(root->left,sum)+pathSum(root->right,sum); } int dfs(TreeNode *root,int sum) { if(root==NULL) return 0; if(root->val==sum) return 1+dfs(root->left,0)+dfs(root->right,0); return dfs(root->left,sum-root->val)+dfs(root->right,sum-root->val); } };
相关文章推荐
- 437. Path Sum III
- 437. Path Sum III
- 437. Path Sum III
- 437. Path Sum III
- leetcode[437] PathSum III 个人题解
- LeetCode.112(113/437) Path Sum I && II && III
- 437. Path Sum III
- 437. Path Sum III
- Leetcode算法学习日志-437 Path Sum III
- 437. Path Sum III
- leetcode(437):Path Sum III
- 437. Path Sum III
- 437. Path Sum III
- LeetCode 437 Path Sum III
- [python]leetcode(437). Path Sum III
- 437. Path Sum III
- 437_Path_Sum_III
- LeetCode 437 Path Sum III
- LeetCode 437 Path Sum III (DFS)
- LeetCode "437. Path Sum III"