首页 > 其他 > 详细

437 路径总和iii

时间:2020-07-21 00:48:18      阅读:88      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 

一、双递归

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

 

437 路径总和iii

原文:https://www.cnblogs.com/-citywall123/p/13348071.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!