题目描述:
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)
数据范围:
0<=n<=10000<=n<=1000
-10^9<=节点值<=10^9−109<=节点值<=109
假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求
示例:
输入:
{1,2,3,4,5,4,3,#,#,-1},6
返回值:
3
说明:
如图所示,有3条路径符合
解题思路:
本题考察数据结构树的使用,可结合深度优先遍历dfs算法完成。
1. FindPath是寻找目标路径的函数,设计一个dfs函数执行深度优先遍历,寻找目标,再定义一个变量result,用来存储符合的路径条数。
2. dfs中当sum值与当前节点的值一致,说明当前的路径和是满足条件的;之后继续递归调用dfs,将节点的左右子树分别探索,注意此时的sum要变为sum-root->val,相当于前面已经走过路径,在动态累加。
3. dfs函数完整执行一遍,就是以root为起点的所有路径完成了一次遍历,但是题目中也可以找某一部分的路径,因此FindPath也要递归操作,将root的左右子树分别作为起点进行遍历,以此类推。最后返回的result就是所有满足条件的路径数。
测试代码:
/**
* struct TreeNode {
*int val;
*struct TreeNode *left;
*struct TreeNode *right;
*TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
// 结果数值
int result=0;
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param sum int整型
* @return int整型
*/
int FindPath(TreeNode* root, int sum) {
// 空节点返回
if(!root)
return result;
// 根节点深度优先遍历
dfs(root,sum);
// 分别以左右子树为起点,进行遍历
FindPath(root->left, sum);
FindPath(root->right,sum);
return result;
}
// 深度优先遍历
void dfs(TreeNode* root,int sum)
{
// 空节点返回
if(!root)
return;
// 找到目标,统计数加一
if(sum==root->val)
result++;
// 左右子树继续探索,注意此时sum要减去当前节点的值
dfs(root->left,sum-root->val);
dfs(root->right,sum-root->val);
}
};