算法打卡day14|二叉树篇03|Leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

算法题

Leetcode  104.二叉树的最大深度

题目链接:104.二叉树的最大深度

大佬视频讲解:二叉树的最大深度视频讲解

个人思路

可以使用层序遍历,因为层序遍历会有一个层数的计算,最后计算到的层数就是最大深度;

解法
迭代法

就是层序遍历的模板代码,遍历节点的时候不用添加值,最后返回深度

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }
        //层序遍历
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);
        int depth = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            depth++;//计算深度
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
            }
        }
        return depth;
    }
}

时间复杂度:O(n);(遍历整棵树)

空间复杂度:O(n);(使用一个列表)

递归法

递归法也很简单,因为是计算树的最大深度,就把二叉树分为两边,各个计算深度取最大值即可。

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度力扣上的高度最低是1,也就是从1开始的;

  • 二叉树节点的深度:指从节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
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;//加一的原因是还有根节点
    }
}

时间复杂度:O(n);(遍历整棵树)

空间复杂度:O(n);(递归树的高度h)


Leetcode 59.n叉树的最大深度

题目链接:59.n叉树的最大深度

个人思路

与上面二叉树的思路差不多,只不过二叉树是遍历左右子树,n叉树就是遍历n各节点

解法

递归法

方法与二叉树最大深度一样,只不过要比较各个节点下的深度

class Solution {
    /*后序遍历求root节点的高度*/
    public int maxDepth(Node root) {
        if (root == null) return 0;

        int depth = 0;
        if (root.children != null){
            for (Node child : root.children){
                depth = Math.max(depth, maxDepth(child));//各个孩子节点中最高的节点
            }
        }

        return depth + 1; //中节点
    }  
}

时间复杂度:O(n);(遍历二叉树)

空间复杂度:O(n);(递归树的高度h

迭代法

与二叉树类似,只修改了孩子节点的遍历放入。

class Solution {
    //使用层序遍历
    public int maxDepth(Node root) {
        if (root == null)   return 0;
        int depth = 0;
        Queue<Node> que = new LinkedList<>();
        que.offer(root);
        while (!que.isEmpty())
        {
            depth ++;//根节点深度加1
            int len = que.size();//每层元素
            while (len > 0)
            {
                Node node = que.poll();

                //对应二叉树层序遍历的左右节点
                for (int i = 0; i < node.children.size(); i++)
                    if (node.children.get(i) != null) 
                        que.offer(node.children.get(i));

                len--;
            }
        }
        return depth;//深度
    }
}

时间复杂度:O(n);(遍历二叉树)

空间复杂度:O(n);(使用队列)


Leetcode 111.二叉树的最小深度

题目链接:111.二叉树的最小深度

大佬视频讲解:二叉树的最小深度视频讲解

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

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

个人思路

也可以层序遍历,当第一次遍历到改节点没有左右孩子,那深度就是最小深度。

解法
迭代法

在原来层序遍历的基础上加个判断节点左右孩子是否为空的操作即可;

class Solution {
   //层序遍历
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        Deque<TreeNode> deque = new LinkedList<>();

        deque.offer(root);
        int depth = 0;
        while (!deque.isEmpty()) {
            int size = deque.size();
            depth++;
            for (int i = 0; i < size; i++) {
                TreeNode poll = deque.poll();

                // 当第一次遍历到叶子结点,直接返回depth,因为从上往下遍历,所以该值就是最小值
                if (poll.left == null && poll.right == null) {
                    return depth;
                }

                if (poll.left != null) {
                    deque.offer(poll.left);
                }
                if (poll.right != null) {
                    deque.offer(poll.right);
                }
            }
        }
        return depth;
    }
}

时间复杂度:O(n);(遍历整棵树)

空间复杂度:O(n);(使用队列)

递归法

注意在节点左孩子或右孩子 为空时的情况,这时深度要加1,看如下代码

class Solution {
    public int minDepth(TreeNode root) {1.确定递归函数的参数和返回值
        if (root == null) {2.确定终止条件
            return 0;
        }
        
        //3.确定单层递归的逻辑
        int leftDepth = minDepth(root.left);
        int rightDepth = minDepth(root.right);

        if (root.left == null) {
            return rightDepth + 1;//原因如上图
        }
        if (root.right == null) {
            return leftDepth + 1;
        }

        // 左右结点都不为null
        return Math.min(leftDepth, rightDepth) + 1;
    }
}

时间复杂度:O(n);(遍历整棵树)

空间复杂度:O(n);(递归树的高度h)


Leetcode 222.完全二叉树的节点个数

题目链接:222.完全二叉树的节点个数

大佬视频讲解:完全二叉树的节点个数视频讲解

个人思路

将二叉树分为左子树和右子树,递归返回节点个数然后相加

解法
递归法
class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        //还有个根节点所以加一
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

时间复杂度:O(n);(遍历二叉树)

空间复杂度:O(n);(递归树的高度h)

迭代法

套用层序遍历的模板,只不过不加入节点值,直接计算节点数量

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++;//遍历一个元素则加1

                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}

时间复杂度:O(n);(遍历二叉树)

空间复杂度:O(n);(使用队列)

以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

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

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

相关文章

AJAX 02 案例、Bootstrap框架

AJAX 学习 AJAX 2 综合案例黑马 API01 图书管理Bootstrap 官网Bootstrap 弹框图书管理-渲染列表图书管理-添加图书图书管理-删除图书图书管理 - 编辑图书 02 图片上传03 更换图片04 个人信息设置信息渲染头像修改补充知识点&#xff1a;label扩大表单的范围 AJAX 2 综合案例 黑…

图片制作二维码能批量生成吗?快捷在线制作二维码的技巧

现在很多场景下获取内容的方式都会通过扫描二维码来获取&#xff0c;比如常见的有文本内容、图片照片、音频视频等。二维码制作的方法也越来越简单&#xff0c;只需要通过二维码生成器的功能就可以快速完成&#xff0c;那么如果需要将多张图片每一张单独生成二维码使用时&#…

学习笔记--强化学习(1)

参考&#xff1a;https://blog.csdn.net/koulongxin123/article/details/122676149 1.什么是强化学习&#xff1f; (1)定义 基于环境的反馈而行动&#xff0c;通过不断与环境的交互、试错&#xff0c;最终完成特定目的或者使得整体行动收益最大化&#xff08;是一种通过与环境…

如何评估产品说明书的质量和有效性

评估产品说明书的有效性和质量涉及多个关键方面&#xff0c;这些方面共同决定了说明书是否能够满足用户的需求&#xff0c;提供准确、清晰且有价值的信息。以下是一些建议的评估步骤和标准&#xff1a; 1、完整性检查&#xff1a; 确保产品说明书涵盖了产品的所有关键功能和特…

ai怎么制作ppt?保姆级的ai一键生成ppt教程来了!

面对市面上多如牛毛的 ai 生成 ppt 软件&#xff0c;哪一款更适合日常使用呢&#xff1f;与此同时&#xff0c;在选定一款 ai 软件后&#xff0c;如何用 ai 制作 ppt&#xff0c;也是很多人第一次使用 pptai 工具会面临的具体问题。 就着这些问题&#xff0c;在接下来的文章中…

【分类讨论】【解析几何】【 数学】【推荐】1330. 翻转子数组得到最大的数组值

作者推荐 视频算法专题 本文涉及知识点 分类讨论 解析几何 LeetCode1330. 翻转子数组得到最大的数组值 给你一个整数数组 nums 。「数组值」定义为所有满足 0 < i < nums.length-1 的 |nums[i]-nums[i1]| 的和。 你可以选择给定数组的任意子数组&#xff0c;并将该子…

Mac电脑搭建前端项目环境,并适配老项目

1.上一篇文章中&#xff0c;我说到了&#xff0c;node.js中文网下载node 包&#xff0c;根据系统进行选择&#xff0c;然后安装包node即可&#xff0c;对于比较新的项目确实也是适用的&#xff0c;但是老项目就不行了会报错&#xff0c;node版本过高&#xff0c;导致环境不匹配…

全栈的自我修养 ———— python使用绘制工具turtle

实现基础turtle入门 一、下载二、基础知识三、实现效果1、圆2、五3、蛇5、循环的正方形 一、下载 turtle是python中模块中自带的一般不需要下载如果报错如下&#xff0c;需要下载自己下载python-tk模块,详细请看python-tk下载 (mac的话可以直接用brew install python-tk) (my…

Kubernetes operator系列:webhook 知识学习

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

Pixelmator Pro:专业级图像编辑,触手可及mac版

Pixelmator Pro是一款功能强大的图像编辑软件&#xff0c;专为Mac操作系统设计。它拥有直观的界面和丰富的工具&#xff0c;能够满足用户各种图像处理需求。 Pixelmator Pro软件获取 首先&#xff0c;Pixelmator Pro支持多种文件格式&#xff0c;包括JPEG、PNG、GIF、BMP、TIF…

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域&#xff1a;4.1.1 建立疾病数据库&#xff1a;4.1.2 临床决策支持&#xff1a;4.1.3 疾病预警和监控&#xff1a; 4.2 电子商务领域&…

将Linux curl命令转换为windows平台的Python代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

unity3d Animal Controller的Animal组件中Stances,Advanced基础部分理解

Stances 立场 立场要求在动物动画控制器上的姿态动画参数。 你可以有多个运动状态,并根据当前的立场使用它们 过渡的条件是: Stance StanceID Default Stance默认姿势 如果调用函数Stance_Reset&#xff08;&#xff09;&#xff0c;动物将返回到的默认姿势。 Current …

SpringBoot扩展篇:Spring注入 @Autowired @Resource

Spring注入 Autowired & Resource 1. 概述1.1 职责1.2 流程概述 2. Demo3. AutowiredAnnotationBeanPostProcessor注册4. 注册元数据4.1 AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition4.2 AutowiredAnnotationBeanPostProcessor#findAutowiringMe…

Android 仿天通卫星对准(卫星在圆形卫星轨道上转动)效果实现

效果图 View源码 package com.android.circlescalebar.view;import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics…

人工智能入门学习笔记1:什么是人工智能

一、什么是人工智能 人工智能(Artificial Intelligence)&#xff0c;是一个以计算机科学&#xff08;Computer Science&#xff09;为基础&#xff0c;由计算机、心理学、哲学等多学科交叉融合的交叉学科、新兴学科&#xff0c;研究、开发用于模拟、延伸和扩展人的智能的理论、…

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…

英文参考文献中,p 和 pp分别表示什么,该如何去使用?

在英文参考文献中&#xff0c;p 和 pp 是用来表示页码范围的常见缩写。它们各自的含义如下&#xff1a; p&#xff1a;代表“page”&#xff08;页&#xff09;&#xff0c;通常用于表示一个单独的页码。例如&#xff0c;如果参考文献中的引用出现在某书的第12页&#xff0c;那…

mac电脑解决无法打开软件

文章目录 报错内容解决方法一方法二方法三 报错内容 macOS无法验证此App是否包含恶意软件。 解决方法一 打开系统偏好设置>安全性与隐私>通用&#xff0c;这个时候有个按钮&#xff0c;“仍然允许”点击即可。 方法二 按住Control键点按应用, 然后打开&#xff0c…

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。
最新文章