路径总和(437. 路径总和 III)

路径总和一:

判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。

public boolean hasPathSum(TreeNode r, int targetSum) {
        if(r == null){ //判断遇到空节点,直接判错 特例--空节点无值,根本就不可能
            return false;
        }
        //注意前后俩个判断不一样! 上一个判断是否是空节点;下一个判断是否是叶子结点(左右子节点都是空节点)
        if(r.left ==  null && r.right == null){//叶子结点判断
            return r.val == targetSum;
        }
        //此节点判断完就开始往子节点开始判断
        return hasPathSum(r.left,targetSum - r.val) || hasPathSum(r.right,targetSum - r.val);
    }

时间复杂度:O(n)  遍历每个节点一次 。

空间复杂度:O(H) H表示树高。最坏时H == n也就是二叉树呈链表状即为O(n);最好是完全二叉树 树高与节点数呈正相关也就是O(logn)

路径总和二:

List> ans = new LinkedList>();
    Deque path = new LinkedList();
    //记住这俩个数据结构 这类型题目常用

    public List> pathSum(TreeNode r, int sum) {
        dfs(r,sum);
        return ans;
    }

    public void dfs(TreeNode r, int sum){
        if(r == null){ //到达叶子结点后还会左右递归 于是返回
            return;
        }
        path.offerLast(r.val);
        sum -= r.val;
        if(r.left == null && r.right == null && sum == 0){
            ans.add(new LinkedList(path));
        }
        dfs(r.left,sum);
        dfs(r.right,sum);
        path.pollLast();//左右递归后 撤销加入到临时路径的节点
    }

你可能感兴趣的:(算法笔记,java,算法,开发语言)