437. 路径总和 III

154 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

image.png

截屏2021-09-28 下午11.41.58.png

思路分析

先用最简单的方法——穷举,遍历每个节点,对于每个节点使用深度优先遍历不断使数字接近targetSum。

一个最简单的dfs十分的容易构建

int dfs(TreeNode* root, int targetSum) {
        if (!root) {
            return 0;
        }
        int ret = 0;
        if (root->val == targetSum) ret++;
        ret += dfs(root->left, targetSum - root->val);
        ret += dfs(root->right, targetSum - root->val);
        return ret;
    }

不过单纯的使用一次dfs只能让我们算出一个根结点下面有几种可能,因此我们需要不断遍历其他节点得到总数,当然这个过程也可以使用dfs进行实现,

第二个dfs和第一个大同小异,这里就不赘述了,不过我们注意到,当targetSum变为负数的时候,这个程序依旧会运行下去,因此我们可以在此基础上用限制targetSum值的方式为我们的dfs进行剪枝,从而大大提高我们计算速度。