给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
示例:
root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
10
/ \
5 -3
/ \
3 2 11
/ \
3 -2 1
返回 3。和等于 8 的路径有:
- 5 -> 3
- 5 -> 2 -> 1
- -3 -> 11
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
private:
vector<int> sums;
int count = 0;
public:
int pathSum(TreeNode* root, int sum) {
if (root == NULL) return 0;
sums.resize(maxDepth(root), sum);
travel(root, 1, sum);
return count;
}
int maxDepth(TreeNode* root) { // 求树的深度,以获取sums数组的大小
if (root == NULL) return 0;
return max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
void travel(TreeNode* node, int level, int sum) {
// 深度优先遍历,sums数组保存从根节点到当前节点路径上的节点之和
// level:当前深度
if (node == NULL) return;
sums[level] = sums[level - 1] + node->val;
for (int i = 0; i < level; i++)
{
if (sums[level] - sums[i] == sum) count++;
}
travel(node->left, level + 1, sum);
travel(node->right, level + 1, sum);
}
};
链接:https://leetcode-cn.com/problems/path-sum-iii