每日三题-二叉树的最大深度、二叉树中的最大路径和、路径总和III

简介: 每日三题二叉树的最大深度二叉树中的最大路径和路径总和III

二叉树的最大深度


9171b70870bf42f6a7c742f012b5d42f.png解法一

递归

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null)return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left,right)+1;
    }
}


二叉树中的最大路径和


471b6ae9fd3e4b538a62edef541c2ec7.png

解法一


暴力递归

cur,left,right以及cur的父节点parent

第一种情况:以cur节点为根节点得到最大(cur+left+right)

第二种情况:以parent为根节点得到最大(parent+cur+Math.max(left,right))

这里只能取一边因为要构成路径

class Solution {
    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        getMax(root);
        return res;
    }
    public int getMax(TreeNode root){
        if(root == null) return 0;
        int cur = root.val;
        // 获取左边的值,如果为负数则不取左边
        int left = Math.max(getMax(root.left),0);
        int right = Math.max(getMax(root.right),0);
        int sum = cur + left + right;
        res = Math.max(sum,res);
        // 取左右两边的大值返回给root的父节点使用
        return cur + Math.max(left,right);
    }
}


路径总和III


8a3ec36812c943848e259ff424a3e844.png


解法一

暴力

算出以节点为根节点满足条件的路径数

再算出每个节点的再相加

class Solution {
    //递归每一个节点
    public int pathSum(TreeNode root, int targetSum) {
        int res = 0;
        if(root == null) return 0;
        res+=sum(root,targetSum);
        res+=pathSum(root.left,targetSum);
        res+=pathSum(root.right,targetSum);
        return res;
    }
    // 注意这里要用long
    public int sum(TreeNode root,long targetSum){
        int res = 0;
        //递归结束条件
        if(root == null) return 0;
        //当前节点满足了res++;
        if(targetSum == root.val){
            res++;
        }
        //继续找左边
        res+=sum(root.left,targetSum-root.val);
        //找右边
        res+=sum(root.right,targetSum-root.val);
        return res;
    }
}

解法二

前缀和

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        HashMap<Long,Integer> map = new HashMap<>();
        map.put(0L,1);
        return sum(root,targetSum,0L,map);
    }
    // 注意这里要用long
    public int sum(TreeNode root,int targetSum,long curSum,HashMap<Long,Integer> map){
        int res = 0;
        //递归结束条件
        if(root == null) return 0;
        curSum = curSum+root.val;
        res+=map.getOrDefault(curSum-targetSum,0);
        map.put(curSum,map.getOrDefault(curSum,0)+1);
        //计算左右边
        res+=sum(root.left,targetSum,curSum,map);
        res+=sum(root.right,targetSum,curSum,map);
        //移除当前
        map.put(curSum,map.get(curSum)-1);
        return res;
    }
}


相关文章
|
3天前
|
人工智能 测试技术 Windows
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数
【剑指offer】-二叉树中和为某一值的路径-24/67
【剑指offer】-二叉树中和为某一值的路径-24/67
|
7月前
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树
26 0
|
3天前
leetcode-124. 二叉树中的最大路径和
leetcode-124. 二叉树中的最大路径和
19 0
|
5月前
|
算法 测试技术 C#
C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数
C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数
|
6月前
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
34 0
|
11月前
剑指offer_二叉树---二叉树中和为某一值的路径
剑指offer_二叉树---二叉树中和为某一值的路径
58 0
|
11月前
剑指offer 35. 二叉树中和为某一值的路径
剑指offer 35. 二叉树中和为某一值的路径
37 0
leetcode【二叉树中的最大路径和】
leetcode【二叉树中的最大路径和】
leetcode【二叉树中的最大路径和】