代码随想录刷题】Day16 二叉树03

在这里插入图片描述

文章目录

  • 1.【104】二叉树的最大深度(优先掌握递归)
    • 1.1 前言
    • 1.2 题目描述
    • 1.3 递归法java代码实现
    • 1.4 迭代法java代码实现
    • 1.5 相关练习题【559】N叉树的最大深度
  • 2.【111】二叉树的最小深度(优先掌握递归)
    • 2.1 题目描述
    • 2.2 递归法java代码实现
    • 2.3 迭代法 java代码实现
  • 3.【222】完全二叉树的节点个数
    • 3.1 题目描述
    • 3.2 java代码实现

  • 【104】二叉树的最大深度
  • 【111】二叉树的最小深度
    • 【559】N叉树的最大深度
  • 【222】完全二叉树的节点个数

1.【104】二叉树的最大深度(优先掌握递归)

【104】二叉树的最大深度

1.1 前言

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
  • 前序求深度,后序求高度。

如图所示:

请添加图片描述

1.2 题目描述

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述

1.3 递归法java代码实现

我们知道了二叉树的深度和高度,那么根节点的高度就是二叉树的最大深度,所以本题中我们可以通过后序遍历求的根节点高度来求二叉树的最大深度。

此题的递归三部曲

    1. 确定递归函数的参数和返回值

参数就是传入的树的根节点,返回这棵树的深度,所以返回值类型是int型

public int getDepth(TreeNode node)
    1. 确定终止条件

如果为空节点的话,就返回0,表示高度为0。

if (root == null) {
	return 0;
}
    1. 确定单层递归的逻辑

先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。

int leftDepth=maxDepth(root.left);
int rightDepth=maxDepth(root.right);
int depth=Math.max(leftDepth,rightDepth)+1;
return depth;

整体代码如下:

class solution {
    /**
     * 递归法
     */
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }
}

1.4 迭代法java代码实现

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:
请添加图片描述

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

	/**
     * 迭代法
     */
class Solution {
    public int maxDepth(TreeNode root) {
        Queue<TreeNode> que=new LinkedList<>();
        if (root==null){
            return 0;
        }
        
        que.offer(root);
        int depth=0;//深度
        while (!que.isEmpty()) {
            int len=que.size();
            for (int i=0;i<len;i++){
                TreeNode tempNode=que.poll();
                if (tempNode.left!=null){
                    que.offer(tempNode.left);
                }
                if (tempNode.right!=null){
                    que.offer(tempNode.right);
                }
            }
            depth++;
        }
        return depth;

    }
}

1.5 相关练习题【559】N叉树的最大深度

【559】N叉树的最大深度

class Solution {
    public int maxDepth(Node root) {
         if (root==null){
            return 0;
        }
        int maxChildDepth=0;
        List<Node> children=root.children;
        for (Node child : children) {
            int childDepth=maxDepth(child);
            maxChildDepth=Math.max(maxChildDepth,childDepth);
        }
        return maxChildDepth+1;
    }
}

2.【111】二叉树的最小深度(优先掌握递归)

【111】二叉树的最小深度

2.1 题目描述

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

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

说明:叶子节点是指没有子节点的节点。
在这里插入图片描述

2.2 递归法java代码实现

此题的重点在于读懂题意,理解最小深度最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
请添加图片描述

递归三部曲:

  • 1.确定递归函数的参数和返回值

参数为要传入的二叉树根节点,返回的是int类型的深度。

public int getDepth(TreeNode node)
  • 2.确定终止条件

终止条件也是遇到空节点返回0,表示当前节点的高度为0。

		if (node==null){
            return 0;
        }
  • 3.确定单层递归的逻辑
    • 如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。
    • 右子树为空,左子树不为空,最小深度是 1 + 左子树的深度
    • 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。

遍历的顺序为后序(左右中),可以看出:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

整体代码如下:

class Solution {
    public int minDepth(TreeNode root) {
        return getDepth(root);

    }
    public int getDepth(TreeNode node){
        if (node==null){
            return 0;
        }
        int leftDepth=getDepth(node.left);
        int rightDepth=getDepth(node.right);

        //当一个左子树为空,右不为空,这时不是最低点
        if (node.left==null && node.right!=null){
            return rightDepth+1;
        }
        //当一个右子树为空,左不为空,这时不是最低点
        if (node.left!=null && node.right==null){
            return leftDepth+1;
        }
        int result=Math.min(leftDepth,rightDepth)+1;
        return result;
    }
}

2.3 迭代法 java代码实现

相对于 【104】二叉树的最大深度,本题还也可以使用层序遍历的方式来解决,思路是一样的。

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。 如果其中一个孩子为空则不是最低点。

class Solution {
    public int minDepth(TreeNode root) {
    //迭代法
        /**
         * 相对于 104.二叉树的最大深度 ,
         * 本题还也可以使用层序遍历的方式来解决,思路是一样的。
         *
         * 需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。
         * 如果其中一个孩子为空则不是最低点
         */
        Queue<TreeNode> que = new LinkedList<>();
        if (root == null) {
            return 0;
        }

        que.offer(root);
        int depth = 0;
        while (!que.isEmpty()){
            int len = que.size();
            depth++;
            TreeNode tempNode = null;
            for (int i = 0; i < len; i++) {
                tempNode = que.poll();
                //如果当前节点的左右孩子都为空,直接返回最小深度
                if (tempNode.left == null && tempNode.right == null){
                    return depth;
                }
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
        }
        return depth;

    }
}

3.【222】完全二叉树的节点个数

【222】完全二叉树的节点个数

3.1 题目描述

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
在这里插入图片描述
提示:

  • 树中节点的数目范围是[0, 5 * 104 ]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

3.2 java代码实现

class Solution {
    // 通用递归解法
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
class Solution {
    // 迭代法
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size -- > 0) {
                TreeNode cur = queue.poll();
                result++;
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能高效的转运机器人,为物流行业注入新动力

在当今社会&#xff0c;随着科技的不断发展&#xff0c;机器人已经逐渐融入到我们的生活中。其中&#xff0c;转运机器人作为物流行业的新秀&#xff0c;正以其高效、智能的特点&#xff0c;引起了广泛的关注。 转运机器人&#xff0c;是指能够自主进行物品搬运和运输的机器人…

说一下类的生命周期

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前&#xff0c;生成式 AI 正受到公众的广泛关注&#xff0c;人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息&#xff0c;本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI&#xff0c;提供了…

京东数据分析软件(京东平台数据分析):2023年Q3扫地机器人行业消费报告

随着90后、00后逐渐成为消费主力军&#xff0c;他们对生活品质更加关注、健康意识进一步增强&#xff0c;再加上“懒人经济”的盛行&#xff0c;人们对扫地机器人的使用率和关注热情也不断增长。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份-9月份&#xf…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

CentOS 8最小安装,VM使用这个内存占用小很多

文章目录 一、安装包下载作者使用的安装包 二、安装过程截图三、最小化安装拥有的外部命令四、查看ip&#xff08;方便ssh连接&#xff09;五、yum源有问题参考文档 一、安装包下载 CentOS 网站&#xff1a; https://www.centos.org/CentOS 维基&#xff1a; https://wiki.cen…

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址&#xff1a;https://hugegraph.apache.org/ 环境为&#xff1a;linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…

xss-labs靶场1-5关

文章目录 前言一、靶场需要知道的前置知识点1、什么是xss攻击&#xff1f;2、xss攻击分为几大类1、反射型xss2、存储型xss3、dom型xss 3、xss攻击形成的条件 二、xss-labs关卡1-51、关卡12、关卡23、关卡34、关卡45、关卡5 总结 前言 此文章只用于学习和反思巩固xss攻击知识&a…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

如何在IAR软件中使用STLINK V2编译下载和调试stm8单片机

安装使用IAR后&#xff0c;如使用系统默认设置&#xff0c;往往很难正常实现用stlink v2来下载和调试stm8芯片&#xff0c;我的解决方法如下&#xff1a; 1、打开项目的options菜单&#xff1a; 2、在项目的选项菜单中选择ST-LINK作为调试工具&#xff1a; 3、选择额外的输出…

六、程序员指南:数据平面开发套件

PORT HOTPLUG FRAMEWORK 端口热插拔框架为DPDK应用程序提供在运行时附加和分离端口的能力。由于该框架依赖于PMD实现&#xff0c;PMD无法处理的端口超出了该框架的范围。此外&#xff0c;在从DPDK应用程序分离端口后&#xff0c;该框架不提供从系统中移除设备的方法。对于由物…

1、数仓模型概述

1、问&#xff1a;什么是数据模型&#xff1f; 数仓领域中的模型指的是数据模型&#xff0c;要和商业分析中的模型不同 数据模型就是数据组织和存储方法&#xff0c;它强调从业务、数据存取和使用的角度合理的存储数据 2、问&#xff1a;模型和表的区别&#xff1f; 表是数据物…

只有Target才有PDB

中间的OBJ的debug信息是放在Target里了。

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…

HarmonyOS ArkTS 基础组件的使用(四)

1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1a;…

文章系列2:Unraveling the functional dark matter through global metagenomics

这篇文章发布于2023年10月nature。通讯作者是来自于 DOE Joint Genome Institute, Lawrence Berkeley National Laboratory, Berkeley, CA, USA. 背景介绍&目标 作者首先背景介绍了两种主流宏基因组分析方法&#xff0c;包括reads-based reference mapping&#xff08;eg…

8.Gin 自定义控制器

8.Gin 自定义控制器 前言 在上一篇路由文件抽离的过程中&#xff0c;我们发现接口的业务逻辑还写在路由配置中&#xff0c;如下&#xff1a; 1696385129126 但是如果业务逻辑比较多&#xff0c;如果写在路由之中&#xff0c;肯定不合适。 我们可以将业务逻辑抽离&#xff0c;单…

python实战—核心基础4(超市购物小票随机抽奖程序) lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、random() 函数 描述 random() 方法返回随机生成的一个实数&#xff0c;它在[0,1)范围内。 语法 以下是 random() 方法的语法: import randomrandom.random() 注意&#xff1a;random()是不能直接访问…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL&#xff08;Open Computing Language&#xff09;是一种跨平台的GPU加速技术&#xff0c;由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序&#xff0c;并提供了一组API&#xff0c;可以…