437 路径总和iii

 

 

 

一、双递归

遍历二叉树的每一个节点,然后以该节点为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;
    }
};

 

posted @ 2020-07-20 22:04  知道了呀~  阅读(186)  评论(0编辑  收藏  举报