【剑指offer】27.二叉树中和为某一值的路径(三)
总目录:
1.问题描述
给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。
1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点
2.总节点数目为n
3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)
数据范围:
0<=n<=1000
−10^9<=节点值<=10^9
假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求
2.问题分析
1递归,使用二叉树的遍历(如前、中、后序任选),将遍历到的节点作为根节点,统计以该节点为起点有多少条路径符合要求2哈希表法,暂未看懂
3.代码实例
递归
1 /** 2 * struct TreeNode { 3 * int val; 4 * struct TreeNode *left; 5 * struct TreeNode *right; 6 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 /** 12 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 13 * 14 * 15 * @param root TreeNode类 16 * @param sum int整型 17 * @return int整型 18 */ 19 int pathSum = 0; 20 void recurve(TreeNode* root, int tgtSum) { 21 if (!root) { 22 return; 23 } 24 25 if (root->val == tgtSum) { 26 pathSum++; 27 } 28 29 recurve(root->left, tgtSum - root->val); 30 recurve(root->right, tgtSum - root->val); 31 } 32 33 int FindPath(TreeNode* root, int sum) { 34 if (!root) { 35 return pathSum; 36 } 37 38 //前序遍历 39 recurve(root, sum); 40 FindPath(root->left, sum); 41 FindPath(root->right, sum); 42 43 return pathSum; 44 } 45 };