坚持刷题 | 二叉树的最大深度

news2024/11/16 7:50:38

文章目录

  • 题目
  • 考察点
  • 代码实现
  • 实现总结
  • 扩展
    • 用迭代的方式实现二叉树最大深度
    • 可能的扩展问题

坚持刷题,老年痴呆追不上我,今天刷:二叉树的最大深度

题目

104.二叉树的最大深度
在这里插入图片描述

考察点

  • 二叉树的基本实现: 能够定义二叉树节点(TreeNode)以及构建一个二叉树的基本结构
  • 递归的理解和运用: 能够使用递归的方式遍历二叉树节点
  • 树的深度计算: 能够理解并实现计算二叉树深度的算法

代码实现

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTreeDepth {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int leftDepth = maxDepth(root.left);
            int rightDepth = maxDepth(root.right);

            // 返回左右子树深度的较大值加上当前节点的深度(1)
            return Math.max(leftDepth, rightDepth) + 1;
        }
    }

    public static void main(String[] args) {
        // 创建一个二叉树示例
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTreeDepth binaryTreeDepth = new BinaryTreeDepth();
        int depth = binaryTreeDepth.maxDepth(root);

        System.out.println("二叉树的深度为:" + depth);
    }
}

实现总结

  • 递归的理解和使用:通过递归计算左右子树的深度,并在递归的基础上计算当前节点的深度
  • 树的深度计算:通过比较左右子树的深度,选择较大值,并在此基础上加上当前节点的深度(1),得到整个二叉树的深度
  • 时间复杂度: O(N),其中 N 是二叉树中的节点数。每个节点都会被访问一次,因此时间复杂度是线性的
  • 空间复杂度: O(H),其中 H 是二叉树的高度。递归调用会使用系统调用栈,因此空间复杂度取决于递归的深度,即树的高度。在最坏的情况下,如果树是一个单链表形式的完全不平衡树,空间复杂度为 O(N);在最好的情况下,如果树是平衡二叉树,空间复杂度为 O(log N)
  • 递归调用会占用栈空间,每次递归调用都会将当前状态保存在栈中,因此空间复杂度主要取决于递归的深度。在实际应用中,需要考虑递归深度是否可能达到系统栈的限制

扩展

用迭代的方式实现二叉树最大深度

import java.util.LinkedList;
import java.util.Queue;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class BinaryTreeDepth {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int depth = 0;

        while (!queue.isEmpty()) {
            int levelSize = queue.size();

            for (int i = 0; i < levelSize; i++) {
                TreeNode current = queue.poll();

                if (current.left != null) {
                    queue.offer(current.left);
                }

                if (current.right != null) {
                    queue.offer(current.right);
                }
            }

            depth++;
        }

        return depth;
    }

    public static void main(String[] args) {
        // 创建一个二叉树示例
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTreeDepth binaryTreeDepth = new BinaryTreeDepth();
        int depth = binaryTreeDepth.maxDepth(root);

        System.out.println("二叉树的深度为:" + depth);
    }
}

在该迭代的实现方式参考了 坚持刷题|二叉树的层序遍历,使用了队列来进行层序遍历,每遍历一层,深度加1。这样可以在不使用递归的情况下计算二叉树的深度。这种方法的时间复杂度同样是 O(N),其中 N 是二叉树中的节点数。

可能的扩展问题

  1. 如何使用非递归计算二叉树的深度,对应的时间和空间复杂度是多少?
  2. 能实现除深度计算外的其他二叉树遍历方式吗?能简要说明它们的应用场景吗?
  3. 了解其他二叉树操作吗?比如查找节点、插入和删除节点,可以提供简单的实现吗?
  4. 知道什么是平衡二叉树,为什么它很重要?能介绍一下 AVL 树或红黑树吗?
  5. 如何判断两颗二叉树是否相同?
  6. 在解决二叉树问题时,有没有方法可以优化空间复杂度,特别是不使用递归的情况下?
  7. 二叉树的深度优先搜索和广度优先搜索有什么区别?在什么情况下选择使用哪种方式?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apifox接口测试教程(一)接口测试的原理与工具

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

git本地分支的合并/切换分支时遇到的问题

目录 第一章、本地分支的切换测试1.1&#xff09;切换之前的master分支下文件内容1.2&#xff09;切换到develop分支后修改文件1.3&#xff09;切回master分支出现报错&#xff1a; 第二章、解决方式2.1&#xff09;方式1&#xff1a;commit提交修改2.2&#xff09;方式2&#…

柔性数组和C语言内存划分

柔性数组和C语言内存划分 1. 柔性数组1.1 柔性数组的特点&#xff1a;1.2 柔性数组的使用1.3 柔性数组的优势 2. 总结C/C中程序内存区域划分 1. 柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array)这个概念&#xff0c;但是它确实是存在的。 C99 中&#xff…

解决Git添加.gitignore文件后不生效的问题

1. 问题描述 如上图所示&#xff0c;在已存在.gitignore文件且已经提交过的Git管理的项目中&#xff0c;其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了&#xff0c;可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…

vue+elementUI el-select 中 没有加clearable出现一个或者多个×清除图标问题

1、现象&#xff1a;下方截图多清除图标了 2、在全局common.scss文件中加一个下方的全局样式noClear 3、在多清除图标的组件上层div加noClear样式 4、清除图标去除成功

iOS应用程序混淆加固原理及逆向工具介绍

概要 本文将介绍iOS应用程序混淆加固的原理和常见的加固类型&#xff0c;以及介绍一些常用的逆向工具。同时还会介绍一种代码虚拟化技术&#xff0c;用于进一步保护应用程序不被逆向分析。 引言 移动应用程序开发面临着越来越严峻的安全挑战&#xff0c;特别是在越狱设备上…

k8s1.27.2版本二进制高可用集群部署

文章目录 环境软件版本服务器系统初始化设置关于etcd签名证书etcd集群部署负载均衡器组件安装设置关于k8s自签证书自签CAkube-apiserver 自签证书kube-controller-manager自签证书kube-scheduler自签证书kube-proxy 自签证书admin 自签证书 控制平面节点组件部署**部署kube-api…

Uni-App三甲医院、医保定点三甲医院在线预约挂号系统源码

医院在线预约挂号系统是一种方便患者预约挂号的系统&#xff0c;患者可以通过该系统进行预约挂号&#xff0c;省去了到医院现场排队等待的时间&#xff0c;提高了就诊效率。随着医院信息化水平的不断发展&#xff0c;医院在线预约挂号管理系统已成为医院管理中不可或缺的一部分…

如何在Linux部署JumpServer堡垒机并实现远程访问本地服务

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

KAGGLE · GETTING STARTED CODE COMPETITION 图像风格迁移 示例代码阅读

本博文阅读的代码来自于I’m Something of a Painter Myself | Kaggle倾情推荐&#xff1a; Monet CycleGAN Tutorial | Kaggle 数据集说明 I’m Something of a Painter Myself | Kaggle Files monet_jpg - 300 Monet paintings sized 256x256 in JPEG formatmonet_tfrec -…

Redis相关面试题大全

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

如何快速制作动态gif图?制作gif动图就这么简单

静图和动图是图像的两种不同形式。静图是一张静止不动的图片&#xff0c;没有任何动作或变化。而动图则是由一系列静止的图像组成&#xff0c;通过快速连续播放这些图像&#xff0c;可以形成看起来像是有动作的效果。简单来说&#xff0c;静图是静止的&#xff0c;而动图是具有…

Copilot安装和使用最全教程

背景 Copilot 是一款由 GitHub 和 OpenAI 合作开发的代码辅助工具。它基于 OpenAI 的大型语言模型 GPT-3.5&#xff0c;专为帮助软件开发者提升编程效率而设计 Copilot的主要功能是通过理解用户输入的代码注释或部分代码片段、自动生成或补全代码&#xff0c;本文主要介绍copi…

常规二分查找中遇到的问题

以前我们写二分查找的时候&#xff0c;是这么写的&#xff1a; public static int binarySearch2(int []a,int target){int i0,ja.length-1;while(i<j){int mid(ij)/2;if(a[mid]target){return mid;}else if(a[mid]<target){imid1;}else {jmid-1;}}return -1;} 这么写&…

Conda python管理环境environments 一 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门 使用 conda&#xff0c;可以创建、导出、列出、删除和更新 具有不同 Python 版本和/或 安装在其中的软件包。在两者之间切换或移动 环境称为激活环境。您…

如何在CentOS8使用宝塔面板本地部署Typecho个人网站并实现公网访问【内网穿透】

文章目录 前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 Typecho是由type和echo两个词合成的&#xff0c;来自于开发团队的头脑风暴。Typecho基于PHP5开发&#xff0c;支持多种数据库&#…

Java 面向对象案例01(黑马)

文字版格斗游戏 在Javabean类中定义方法的形参的数据类型可以是什么&#xff1f; 在JavaBean类中&#xff0c;方法的形参的数据类型可以是任何合法的Java数据类型&#xff0c;包括基本数据类型&#xff08;如int、char、boolean等&#xff09;、引用数据类型&#xff08;如Str…

【文件处理】spring boot 文件处理

接收文件 PostMappingpublic result<String> add(MultipartFile file) throws IOException {// 得到目标文件夹File directory new File("file");//如果文件夹不存在就创建if(!directory.exists()){directory.mkdirs();}//文件名称String fileName file.getO…

分子生成工具应用案例+流程 - Pocket Crafter

2023年10月9日&#xff0c;诺华公司的Lingling Shen和He Wang在Chemrxiv上发表了文章《Pocket Crafter: A 3D Generative Modeling Based Workflow for the Rapid Generation of Hit Molecules in Drug Discovery》&#xff0c;介绍了他们分子生成在hit finding项目应用中的pip…