437.路径总和|||
题目描述:
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
思想:
本题需要去计算路径和等于给定数值的路径总数,依旧遵循树模型的解题思路,按照递归的方式去求解(递归的一个重要思想就是两部分:1.找到最简单的子问题求解,2.其他问题不考虑内在细节,只考虑整体逻辑),那我们现在来设计递归关系:
首先,最简单的子问题是什么呢?由于这道题是在树的框架下,我们最容易想到的就是遍历的终止条件:
if(root == null){
return 0;
}
接下来,来考虑再上升的一个层次,题目要求 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点) 。因此只需要去求三部分即可:
- 以当前节点作为头结点的路径数量
- 以当前节点的左孩子作为头结点的路径数量
- 以当前节点的右孩子作为头结点啊路径数量
将这三部分之和作为最后结果即可。
最后的问题是:应该如何去求以当前节点作为头结点的路径的数量?这里依旧是按照树的遍历方式模板,每到一个节点让sum-root.val,并判断sum是否为0,如果为零的话,则找到满足条件的一条路径。
代码:
/** * 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 pathSum(TreeNode* root, int sum) { if(root == NULL) return 0; int result = countPath(root,sum); int left = pathSum(root->left,sum); int right = pathSum(root->right,sum); return result + left + right; } int countPath(TreeNode* root,int sum){ if(root == NULL) return 0; sum -= root->val; int result = (sum == 0) ? 1 : 0; int left = 0,right = 0; //if(sum != 0) 注意不能在此处判断sum!=0就停止后续路径的查找,因为可能满足条件的延申路径 left = countPath(root->left,sum); right = countPath(root->right,sum); return result + left + right; } };