一、双递归
遍历二叉树的每一个节点,然后以该节点为dfs的搜索起点,判断累加和是否为给定值,进行计数
class Solution { public: int pathNumber = 0; int pathSum(TreeNode* root, int sum) { if (!root) return 0; //尝试用二叉树的每一个节点为搜索起点,判断路径和是否等于sum dfs(root, sum); pathSum(root->left, sum); pathSum(root->right, sum); return pathNumber; } void dfs(TreeNode* root, int sum) { if (!root) return; sum -= root->val; if (!sum) ++pathNumber; dfs(root->left, sum); dfs(root->right, sum); } };
二、dfs遍历求路径和+map记录
从根节点开始dfs搜索二叉树,记录每一个节点的路径和ans,判断map[ans-sum]是否被标记,若被标记则表明存在这样的路径和,在回溯的时候记得map[ans]--,否则会出错
class Solution { public: map<int, int>mp; int count = 0; void dfs(TreeNode* root, int ans,int sum) { if (root == NULL) return; ans = ans + root->val; count += mp[ans - sum]; mp[ans]++; dfs(root->left, ans,sum); dfs(root->right, ans,sum); //回溯的时候要把标记过的一些点清除掉,否则会重复计算 mp[ans]--; return; } int pathSum(TreeNode* root, int sum) { mp[0] = 1; dfs(root, 0, sum); return count; } };