题目描述链接:https://leetcode-cn.com/problems/path-sum-iii/submissions/
基本思路:此题思路和LeetCode 1367中的二叉树中的列表一题思路基本类似。即同为通过枚举方法实现。对每一个节点进行枚举,查看是否有以改节点为首的路径满足条件。
这里记录一下自己在解决此问题中犯的一个错,即初使的如下代码:
/** * 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: int res; int pathSum(TreeNode* root, int sum) { //考虑枚举每个节点 if(!root) return 0; dfs(root,sum); pathSum(root->left,sum); pathSum(root->right,sum); return res; } void dfs(TreeNode* root,int sum){ if(root==NULL){ return ; } if(sum-root->val==0){ res=res+1; return ; } dfs(root->left,sum-root->val); dfs(root->right,sum-root->val); } };
在以上代码中一个不容易发现的错误即其中的如下代码:
if(sum-root->val==0){ res=res+1; return ; }
错就错在return上,会导致遗漏结果,导致出错。因为在这里return会遗漏掉可能后续还会再加出0的情况,与当前的sum相加同为sum的情况,以图来说明如下
在此图中如果加入return就会导致1,-2,1,-1这个例子的遗漏,因为1,-2已经满足,就不会以1为根节点继续向下搜索了。。。
解决方案,去掉return即可,最终通过代码如下:
/** * 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: int res; int pathSum(TreeNode* root, int sum) { //考虑枚举每个节点 if(!root) return 0; dfs(root,sum); pathSum(root->left,sum); pathSum(root->right,sum); return res; } void dfs(TreeNode* root,int sum){ if(root==NULL){ return ; } if(sum-root->val==0){ res=res+1; } dfs(root->left,sum-root->val); dfs(root->right,sum-root->val); } };