• 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;
        }
    };
  • 相关阅读:
    HDU
    QDUoj GZS的三角形 棋盘里的数学 思维+杨辉三角
    HDU
    HDU
    CodeForces
    POJ
    QDUOJ 东北大炸弹 宝岛地图-枚举+数组记录+前缀和
    HDU
    QDUOJ 分辣条-01背包恰好装满情况
    HDU
  • 原文地址:https://www.cnblogs.com/-citywall123/p/13348071.html
Copyright © 2020-2023  润新知