(Leetcode 刷题) 路径总和Ⅲ

题目描述

给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
437. 路径之和Ⅲ

解法1 递归

用了两个递归,第一个递归是算给定节点为根的树中有多少满足条件的路径;第二个递归是二叉树的每个节点都执行一次第一个递归。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 * int val;
 * TreeNode left;
 * TreeNode right;
 * TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //用于保存最后的路径总数
    int res = 0;

    public int pathSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        //helper函数计算输入节点有多少条符合条件路径
        helper(root, sum);
        //左孩子
        pathSum(root.left, sum);
        //右孩子
        pathSum(root.right, sum);
        return res;
    }

    public void helper(TreeNode root, int sum) {
        if (root == null) {
            return;
        }
        //每遍历到一个节点,sum减去这个节点值
        sum -= root.val;
        if (sum == 0) {
            res++;
            /*
             *这里一开始我写了条return,但是没过,发现在非叶
             *子节点时sum到0就return而不往下遍历的话,会遗漏后续节点中相加为0的 
             *情况。例如 [1,-2,-3,1,3,-2,null,-1] 的二叉树,[1, -2]是,[1, -2, 1, -1]也是,
             *如果这里有return,后面这条就递归不出来。
            */
        }
        helper(root.left, sum);
        helper(root.right, sum);
    }
}

解法2 递归加回溯

提交了第一种解法的代码后,去leetcode后台看了下数据,发现有人提交了3ms的结果(解法1 28ms),里面有更为惊艳的想法。
这篇讲得很清楚

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容