【每日三题】二叉树的最小深度,二叉树的最大深度

146 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情 >>


每日三刷,剑指千题

计划简介:

  • 每日三题,以中等题为主,简单题为辅进行搭配。保证质量题1道,数量题3道。
  • 每日早通勤在LeetCode手机端选题,思考思路,没答案的直接看题解。
  • 每日中午进行编码,时间控制在一小时之内。
  • 下班前半小时进行整理总结,并发布到掘金每日更文活动。

说明:

  • 基于以前的刷题基础,本次计划以中等题为主,大部分中等题都可以拆分为多个简单题,所以数量保证3,质量保证一道中等题即可。
  • 刷题顺序按照先刷链表、二叉树、栈、堆、队列等基本数据结构,再刷递归、二分法、排序、双指针等基础算法,最后是动态规划、贪心、回溯、搜索等复杂算法。
  • 刷题过程中整理相似题型,刷题模板。
  • 目前进度 102/1000

新阶段

经过6天,18题,链表暂告一段落,我们来刷二叉树。

因为二叉树的题之前刷的比较少,第一天先从简单题开始。

[111]二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例 1:

img

输入:root = [3,9,20,null,null,15,7]
输出:2

解析

mp.weixin.qq.com/s/4n_L-px-5…

Code

自底向上递归

private int extracted(TreeNode root) {
        if (root ==null){
            return 0;
        }
        int left = minDepth(root.left);
        int right = minDepth(root.right);
        if (root.left==null|| root.right==null){
            return left+right+1;
        }
        return Math.min(left,right)+1;
    }

层次遍历

public int minDepth(TreeNode root) {
        if (root == null)return 0;
​
        int depth = 1;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            int n = queue.size();
            for (int i = 0; i < n; i++) {
                TreeNode node = queue.poll();
                if (node.left==null&&node.right==null){
                    return depth;
                }
                if (node.left!=null){
                    queue.offer(node.left);
​
                }
                if (node.right!=null){
                    queue.offer(node.right);
                }
            }
            depth++;
        }
        return depth;
    }

[剑指 Offer 55 - I]二叉树的深度

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。

例如:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

解析

最大换成最小即可。

Code

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

[1302]层数最深叶子节点的和

给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和

示例 1:

img

输入:root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出:15

解析

Code

class Solution {
    public int deepestLeavesSum(TreeNode root) {
        if (root==null)return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        Integer depth = 1;
        Integer sum = 0;
        while (!queue.isEmpty()){
            sum = 0;
            int n = queue.size();
            for (int i = 0; i < n; i++) {
                TreeNode node = queue.poll();
                if (node.right == null&&node.left==null){
                    sum+=node.val;
                }
                if (node.right!=null){
                    queue.offer(node.right);
                }
                if (node.left!=null){
                    queue.offer(node.left);
                }
            }
            depth++;
        }
        return sum;
    }
}

\