437.路径总和 III

一、题目描述

给定一个二叉树,它的每个结点都存放着一个整数值。

找出路径和等于给定数值的路径总数。

路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 的路径有:

1. 5 -> 3
2. 5 -> 2 -> 1
3. -3 -> 11

二、题解

1.双重递归

完全参考leetcode用户烽火前秦路的题解

使用两层递归:

第一层:

  • help()函数:遍历从顶点开始和为sum的路径数

第二层:

  • pathSum()函数:通过调用help()函数,遍历根节点,并递归遍历左右子树中所有和为sum的路径数

2.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int help(struct TreeNode *p, int sum)
{
int res = 0;
if (p == NULL)
return 0;
if (p->val == sum)
res++;
res += help(p->left, sum - p->val);
res += help(p->right, sum - p->val);
return res;
}

int pathSum(struct TreeNode *root, int sum)
{
if (root == NULL)
return 0;
int cnt = help(root, sum);
return cnt + pathSum(root->left, sum) + pathSum(root->right, sum);
}