自学内容网 自学内容网

leetcode 437.路径总和III

思路:其实说出来也就是一个深度优先搜索的问题而已。

我们可以首先遍历出树的全部结点,然后我们就从中一个一个拿出来进行深度优先搜索,也就是俗称的DFS。DFS的参数就定义为三个参数,一个参数用来存放结点,一个参数用来存放目前已经加了多少的和,还有目标和。

在DFS过程中,我们需要判断的条件无非有那么几个:首先就是本结点是不是空的,如果是就直接结束这个函数;如果我们目前加的和已经和目标i和相同了,我们就让全局变量cnt加1.

注意:有些人会问,为什么sum>targetSum不能作为终止条件呢?因为这里面的元素中会考虑负数的存在,我们如果目前和大于目标和了之后,要是后面有负数可以加上变成目标和,我们岂不是错过了这一种可能呢?所以这个不能作为条件。

还有就是结点有无的判断和是否是目标和的判断一定要分清先后,如果结点不存在在前,我们就需要先加上本结点的元素,然后判断目标和是否一致。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int cnt=0;
    List<TreeNode>list=new ArrayList<>();
    public int pathSum(TreeNode root, int targetSum) {
        if(root==null)
        return 0;
        qianxu(root);
        for(int i=0;i<list.size();i++){
            dfs(list.get(i),0,targetSum);
        }
        return cnt;
    }
    public void dfs(TreeNode t,long sum,int targetSum){
        if(t==null)
        return;
        sum+=t.val;
        if(sum==targetSum)
        cnt++;

        dfs(t.left,sum,targetSum);

        dfs(t.right,sum,targetSum);
        
    }
    public void qianxu(TreeNode t){
        if(t==null)
        return;
        list.add(t);
        qianxu(t.left);
        qianxu(t.right);
    }
}


原文地址:https://blog.csdn.net/m0_73917165/article/details/142392413

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!