代码随想录算法训练营第16天 |● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

ArcGIS拓扑检查实战:5分钟搞定面重叠与缝隙问题(附详细截图) 本文详细介绍了如何使用ArcGIS进行拓扑检查,快速解决面重叠与缝隙问题。通过搭建拓扑检查环境、配置拓扑规则、五步闪电修复法及批量处理技巧,帮助用户高效完成数据修正,提升GIS数据质量。特别适合地籍管理、规划红线等场景应用。 阅读详情


前言

所有的题目一刷都是优先掌握递归,迭代法没看,记不住。打十个做完之后再说吧
104和111没有看先序遍历的代码

104.二叉树的最大深度

在这里插入图片描述

思路

知识点

记住深度和高度的定义:1. 从1开始 计数 2. 深度和高度与我们主观常识一致
在这里插入图片描述

总体思路:求解最大深度就是求解根节点的高度;💛

因为求深度是前序遍历,求高度是后序遍历【在子节点的高度上加1就是根节点的高度】,后序遍历要比前序遍历在本题中简洁一些,所以本题使用后序遍历的求高度;
💟具体实现细节:单层递归中求解的逻辑是,当前节点的高度为子节点高度+1;【递归法的第三步】
递归三部曲
在这里插入图片描述
先序遍历有c++代码,非常直观的从上往下的递归。也可以看

方法一 递归法

class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        def getheight(root):
            if not root: return 0
            height_left = getheight(root.left)
            height_right =getheight(root.right)
            height = 1+max(height_left,height_right)
            return height
        
        return getheight(root)
###精简版
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
      
        if not root: return 0
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))

方法二 迭代法

559. n叉树的最大深度

这题目我也刷了

class Solution:
    def maxDepth(self, root: 'Node') -> int:
        if not root:
            return 0
        
        max_depth = 1
        
        for child in root.children:
            max_depth = max(max_depth, self.maxDepth(child) + 1)
        
        return max_depth

111.二叉树的最小深度

在这里插入图片描述

思路

总体思路:与上面的最大深度差不多,但是不能单纯将max改成min。

  • 如果直接max改成min的话,例如下面的最右边的节点6会被算成高度为1,因为min子节点的结果为0,也就是将6当成叶子了;或者按照老师讲解的,根节点中会算左边的null为0.,这样最小深度就是1了。
    下面是老师的讲解
    在这里插入图片描述

  • 所以这条题目相较于104的改动就是加上分类讨论:(这是递归法的第三步单层逻辑)

    • 子节点中,一个是null,一个有节点,按照有节点的那个算
    • 两个都有的话选择min的那个
    • 两个都是空那就是0【可以与上面那个合并】
      在这里插入图片描述

方法一 后向遍历递归法

自己写的错误

  1. 在类里面调用递归的时候,记得加上self
  2. 下面是教程里面的代码,我写的时候is None用not来代替了,我觉着这样国家好一些
class Solution:
    def getDepth(self, node):
        if node is None:
            return 0
        leftDepth = self.getDepth(node.left)  # 左
        rightDepth = self.getDepth(node.right)  # 右
        
        # 当一个左子树为空,右不为空,这时并不是最低点
        if node.left is None and node.right is not None:
            return 1 + rightDepth
        
        # 当一个右子树为空,左不为空,这时并不是最低点
        if node.left is not None and node.right is None:
            return 1 + leftDepth
        
        result = 1 + min(leftDepth, rightDepth)
        return result

    def minDepth(self, root):
        return self.getDepth(root)

### 精简代码
class Solution:
    def minDepth(self, root):
        if root is None:
            return 0
        if root.left is None and root.right is not None:
            return 1 + self.minDepth(root.right)
        if root.left is not None and root.right is None:
            return 1 + self.minDepth(root.left)
        return 1 + min(self.minDepth(root.left), self.minDepth(root.right))

方法二 迭代法

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

在这里插入图片描述

思路

方法一 当成普通二叉树来做

注意:使用后序遍历的代码是最简洁的
先序遍历:参考104题目教程里面的先序遍历写法,明显会复杂一些,为啥呢,因为需要一个全局变量来++1
单层处理逻辑:后序遍历到这个节点时,已经遍历的节点个数为它的子节点个数之和+1
递归三步走:
在这里插入图片描述

每一个都需遍历一下,时间复杂度为O(n)

class Solution(object):
    def countNodes(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root: return 0
        cright = self.countNodes(root.right)
        cleft = self.countNodes(root.left)
        return 1+cright+cleft

方法二 利用完全二叉树的特性

首先回顾完全二叉树定义:
在这里插入图片描述
总体思路:利用满二叉树如果知道深度为n,节点个数就是2**n-1的特性,避免遍历所有的节点;
递归第三步单层处理逻辑:

  • 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
    • 对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

    • 对于情况二,左右孩子节点数之和加1

      • 左孩子,和右孩子的计算就是递归,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

      在这里插入图片描述
      如何判断是否为完全二叉树:最左边一层和最右边一层节点数相同,这样就只需要遍历最外侧的就行
      在这里插入图片描述
      注意事项

  1. left和right侧边count的起始为1
  2. 2的阶数写为(2 << leftDepth) - 1 #注意(2<<1) 相当于2^2,所以leftDepth初始为0
class Solution(object):
    def countNodes(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        # if not root: return 0
        # cright = self.countNodes(root.right)
        # cleft = self.countNodes(root.left)
        # return 1+cright+cleft
        if not root: return 0
        #判断是否为满二叉树
        left = root.left
        right = root.right
        left_height, right_height = 1,1# 注意这个是1
        while(left):
            left_height +=1
            left = left.left
        while(right):
            right_height += 1
            right = right.right
        if right_height == left_height:
            return 2**right_height -1
        
        cleft = self.countNodes(root.left)
        cright = self.countNodes(root.right)
        return 1+cleft+cright
        
#还有一种技巧计算2的阶数,这时起始height要计算为0;代码如下,
class Solution:
    def countNodes(self, root: TreeNode) -> int:
        if not root:
            return 0
        left = root.left
        right = root.right
        leftDepth = 0 #这里初始为0是有目的的,为了下面求指数方便
        rightDepth = 0
        while left: #求左子树深度
            left = left.left
            leftDepth += 1
        while right: #求右子树深度
            right = right.right
            rightDepth += 1
        if leftDepth == rightDepth:
            return (2 << leftDepth) - 1 #注意(2<<1) 相当于2^2,所以leftDepth初始为0
        return self.countNodes(root.left) + self.countNodes(root.right) + 1
 

更加简洁的写法:完全二叉树写法2【教程里面的】
两侧同时顺着边数,直到有一条边为none,然后依据是否同时到底来判断是否为满二叉树;

class Solution: # 利用完全二叉树特性
    def countNodes(self, root: TreeNode) -> int:
        if not root: return 0
        count = 1
        left = root.left; right = root.right
        while left and right:
            count+=1
            left = left.left; right = right.right
        if not left and not right: # 如果同时到底说明是满二叉树,反之则不是
            return 2**count-1
        return 1+self.countNodes(root.left)+self.countNodes(root.right) 

总结

比较有意思,今天都不想听申论课了。还是算法好玩。。。。可惜找不到工作

麒麟V10 x86_64系统下Qt 5.12.7安装全攻略(附常见报错解决方案) 本文详细介绍了在麒麟V10 x86_64系统上安装Qt 5.12.7的完整流程,包括在线和离线两种安装方案,并提供了常见报错的解决方案。从环境准备到项目配置优化,再到高级调试技巧,全面覆盖Qt开发在国产操作系统上的实践要点,帮助开发者高效搭建开发环境。 阅读详情

相关推荐

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3272

代码随想录算法训练营第16天|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

思路:二叉树求深度:从上往下遍历,前序遍历 求高度:从下往上遍历,后序遍历本题的求最大高度和最大深度都一样,高度即深度。以下用后序遍历求深度,每层递归返回左右子树最大的高度加上本身(当前根节点)的高度.

weixin_54583561的博客 1181

MAX31865模块温度测量

本文主要介绍MAX31865 测温注意事项,并写出读取温度的示例代码,模块详细参数可以查阅相关手册,

7457

代码随想录算法训练营第16天 | 二叉树part03:● 104.二叉树最大深度 559.n叉树最大深度● 111.二叉树最小深度● 222.完全二叉树节点个数

一些发现:if (node->left!= nullptr)可以直接写做 if (node->left);可以在class里统一写一个var就不用用ref传来传去了。2 dfs 后序另一种写法是。104 二叉树最大深度。

weixin_51674457的博客 1351

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5416

国产数据库迁移必看:达梦到ES的CDC方案优化全记录(含完整代码)

本文详细记录了从达梦数据库到Elasticsearch的CDC方案优化全过程,涵盖触发器方案局限性、Debezium架构优势及完整代码实现。通过Flink集成和性能调优,实现毫秒级延迟同步,显著降低数据库负载,为国产数据库迁移提供可落地的技术方案。

weixin_29079671的博客 499

代码随想录算法训练营第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

2、非递归方法,借助队列存储,层序遍历。四、222.完全二叉树的节点个数。一、104.二叉树的最大深度。一、104.二叉树的最大深度。思路:1、递归三种方式都可以。二、559.n叉树的最大深度。三、111.二叉树的最小深度。思路:递归遍历二叉树。

weixin_44565532的博客 2366

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事?

Panel 中控件的图像随着值变化,是怎么回事?

蚂蚁小兵 2145

代码随想录算法训练营第16天|● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

简单给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例 1:[图片]输入:root = [3,9,20,null,null,15,7]输出:3示例 2:输入:root = [1,null,2]输出:2。

嗝~~~~的博客 135

淘系商品的成长密码:历史与趋势透视

本文分析了淘系商品的发展历程,从早期的市场探索到如今的行业领先地位,深入探讨了技术创新、供应链优化、用户需求洞察等关键因素在淘系商品成功中的作用。通过对平台不断完善商品生态、提升购物体验和服务的过程分析,文章总结了淘系商品在竞争激烈的市场中如何通过创新应对挑战并推动电商行业的进步。未来,随着消费趋势变化和新兴模式的兴起,淘系商品将在更大范围内发挥其市场影响力。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

代码随想录算法训练营第16天 | ● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

递归顺序;一、104.二叉树的最大深度 559.n叉树的最大深度深度和高度的区别:高度:基准是叶子节点,想象成山川的高度距离地面;深度:基准是根节点,想象成江河湖海的水深。根节点的高度就是二叉树的最大深度。难点在于为什么在递归的方法中,采用的是后序遍历。确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。确定终止条件:如果为空节点的话,就返回0,表示高度为0。

m0_51671538的博客 98

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

代码随想录算法训练营第16天||● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

和求二叉树的最大深度方法类似。求二叉树的最大深度方法是计算一个max,这个就是计算一个min。但是需要考虑到左子树为空,右子树不为空。右子树为空,左子树不为空的情况。但是我们有很多叶子节点,因为求的是最大深度,所以我们需要返回的是最大的高度。我们可以先遍历到叶子节点,然后从叶子节点一层一层往上遍历,每遍历一次,将高度高度+1。本题用递归的话,是要用到后续遍历的思路。也就是求根节点的最大高度。对于这种N叉树,我们可以用层序遍历去求解,也就是广度优先搜索。递归法实现,昨天实现了用迭代法求二叉树的最大深度。

m0_56068266的博客 201

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

代码随想录算法训练营第16天 | 第六章 二叉树 part03 ● 104.二叉树的最大深度 559.n叉树的最大深度 ● 111.二叉树的最小深度 ● 222.完全二叉树的节点个数

2023年4月11日 16:06:41。

henry87653的博客 110

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

代码随想录算法训练营第16天| Binary Tree|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

【代码】代码随想录算法训练营第16天| Binary Tree|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数。

weixin_39248851的博客 81

代码随想录算法训练营第16天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、● 222.完全二叉树的节点个数

104,559:可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。总结:递归三部曲,重点在于处理逻辑上:比较左右子树的高度,然后返回较大值+1;总结:左右子树都为空才是叶子结点。

weixin_41370451的博客 531

代码随想录算法训练营第16天 第六章 二叉树part03今日内容: ● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数题】

什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。大家 要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。先看视频讲解,和最大深度 看似差不多,其实 差距还挺大,有坑。需要了解,普通二叉树 怎么求,完全二叉树又怎么求。222.完全二叉树的节点个数(优先掌握递归)111.二叉树的最小深度 (优先掌握递归)104.二叉树的最大深度 (优先掌握递归)

m0_50846237的博客 81

【代码随想录算法训练营Day16】● 104.二叉树的最大深度;●559.n叉树的最大深度;● 111.二叉树的最小深度;● 222.完全二叉树的节点个数

所以只需要对单条腿的二叉树进行条件判断,只有右子树就按左子树深度算,只有左子树就按右子树深度算。当遍历到叶子节点(即没有左节点也没有右节点)时,当前层数就是最小深度,其他思想与最大深度相同。如果根据求二叉树最大深度的递归代码来写的话,一条腿的二叉树最小深度就是0了,不符合题意。通过层序遍历先判断每一层有几个元素,通过将每一层套进一个循环,计算循环次数即可。

Tammy2001的博客 958

代码随想录算法训练营第16天| Leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

对于(1),可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。对于(2),分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。接下来思考如何判断是否是满二叉树?

Camellia__Wang的博客 950

代码随想录算法训练营day16||二叉树part03、104.二叉树的最大深度 、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

3.确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。思路:本题要搞懂:什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。时间复杂度:O(n);

qq_40222433的博客 1210

代码随想录算法训练营day16|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

今天这些题目用层序遍历都能很快解决,但效率一般。首先需要明确几个知识点。:(一般采用前序遍历方式):(一般采用后序遍历方式)

github_35852648的博客 866

代码随想录算法训练营第16天 | 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

Laulian的博客 883

代码随想录算法训练营Day16 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 | Python | 个人记录向

二叉树:104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数。

Python基本算法 870

代码随想录算法训练营Day 16|LeetCode104 二叉树的最大深度、LeetCode559 n叉树最大深度、eetcode111 二叉树的最小深度、Leetcode222 完全二叉树的节点个数

下图中的例子便需要特殊讨论①若左子树为空,右子树不为空,则最小深度为1+右子树最小深度;②若右子树为空,左子树不为空,则最小深度为1+左子树最小深度;③若左右子树都不为空,则最小深度为1+min(左子树最小深度,右子树最小深度)。求二叉树最小深度看似与求最大深度类似,实则处理起来还是更麻烦一些:最小深度概念为。与求深度类似,采用后序遍历,将max换成求和,递归后即可得完全二叉树的节点个数。空间复杂度:O(height) height为二叉树高度。空间复杂度:O(height)时间复杂度:O(n)

qq_52807368的博客 1661

代码随想录算法训练营第16天 |(二叉树3 104.二叉树的最大深度 559. N叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。大家 要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。先看视频讲解,和最大深度 看似差不多,其实 差距还挺大,有坑。

weixin_46743838的博客 743
上一篇: 扩散模型学习1
下一篇: 代码随想录算法训练营第17天 |● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
Xalileetcode
博客等级 码龄7年 482粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值