算法打卡Day14
今日任务:
1)104.二叉树的最大深度
2)559.n叉树的最大深度
3)111.二叉树的最小深度
4)222.完全二叉树的节点个数
104.二叉树的最大深度
题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
文章讲解:代码随想录 (programmercarl.com)
视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度哔哩哔哩bilibili
思路:
这道题已经在前一篇文章算法打卡day13层序遍历中做过了,如果采用迭代的方法,就用层序遍历,这题比较简单,遍历完所有节点,每遍历一层深度加一即可
今天采用递归(后序遍历)的方法来做,也可以用前序遍历来做(前序遍历涉及到回溯,我还不理解,等后序二刷再来研究),前序遍历求的就是深度,后序遍历求的是高度
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
其实弄懂这两个概念,就会发现,在此题求二叉树最大深度中,高度与深度可与转换,当我求二叉树最大深度,也就是最底层叶子节点的深度,也就根节点的高度,所以我们求二叉树最大深度可以转换为,求根节点的高度
求高度我们用后序遍历(左右中),后序遍历是找到叶子节点,然后按左右中每次往上遍历,到中时,需要取左数与右树的最大深度
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 递归(后序)def maxDepth(self, root: [TreeNode]) -> int:return self.getHeight(root)def getHeight(self,node):if not node:return 0leftDepth = self.getHeight(node.left) # 左rightDepth = self.getHeight(node.right) # 右height = 1 + max(leftDepth, rightDepth) # 中return height
感想:
这题想清楚了就比较简单,最直截了当的就是层序遍历,递归的方法不好想一点,做之前可能要区分高度与深度,但做完就能跳出深度与高度的概念,后序从下网上,就是从下开始计数,前序从上往下遍历,就是从上开始计数
559.n叉树的最大深度
题目链接:559. N 叉树的最大深度 - 力扣(LeetCode)
给定一个 n 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
文章讲解:代码随想录 (programmercarl.com)
思路:
如果采用迭代,层次遍历,这题与上一题一样只是左右节点换成孩子节点了,其他一样
这题如果采用递归的方法,我们也是采用后序遍历
求二叉树深度,我们只需要求出左右树的深度,然后比较,取最大。但是在N叉树中,我们不知道有几个子树,我们需要遍历子树,并用变量记录最大高度,每求一棵树的高度,变与变量比较,将大值重新赋给变量
class Node:def __init__(self, val=None, children=None):self.val = valself.children = childrenclass Solution:def maxDepth(self, root: Node) -> int:return self.getHeight(root)def getHeight(self,node: Node):if not node:return 0height = 0for child in node.children:height = max(height,self.getHeight(child))return height + 1
111.二叉树的最小深度
题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 这题在02二叉树的层序遍历中做过,采用的层次遍历
文章讲解:代码随想录 (programmercarl.com)
视频讲解:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度哔哩哔哩bilibili
思路:
做了前面几题,这题思路比较好像,递归后序遍历,取左右子树的最小高度即可,但这里面有个坑
最小深度是要找根节点到最近叶子节点的距离,注意是叶子节点,也就就是得遇到左右节点均为空才算遇到了叶子节点
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def minDepth(self, root: [TreeNode]) -> int:return self.getDepth(root)def getDepth(self, node):# 排除左右节点均为空if not node:return 0leftDepth = self.getDepth(node.left)rightDepth = self.getDepth(node.right)# 注意,叶子节点是需要左右都为空才为叶子节点if node.left == None and node.right:depth = rightDepth + 1elif node.right == None and node.left:depth = leftDepth + 1# 现在还剩左右均不为空的情况else:depth = 1+ min(rightDepth,leftDepth)return depth
感想:
以上这两题得递归我写的比较复杂,但是好理解,所以没有放上精简版,如果后面自己熟练了二叉树递归,我在补充上精简版
222.完全二叉树的节点个数
题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)
给出一个完全二叉树,求出该树的节点个数。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6示例 2:
输入:root = []
输出:0
示例 3:输入:root = [1]
输出:1
提示:
树中节点的数目范围是[0, 5 * 10^4]
0 <= Node.val <= 5 * 10^4
题目数据保证输入的树是 完全二叉树
文章讲解:代码随想录 (programmercarl.com)
视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量哔哩哔哩bilibili
二叉树求节点个数统一思路:
这题有两个思路,不管什么二叉树求节点个数,我们可以用迭代层序遍历,或者递归后序遍历,遍历完计数即可,这样会把每个节点遍历一遍
- 时间复杂度:O(n)
- 空间复杂度:O(log n)
lass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 一般二叉树求解方法def countNodes(self, root: [TreeNode]) -> int:return self.getNum(root)def getNum(self,node):if not node:return 0leftNum = self.getNum(node.left)rightNum = self.getNum(node.right)totalNode = leftNum + rightNum + 1return totalNode
完全二叉树求节点个数思路
对于完全二叉树,我们的遍历过程可以简化,不用遍历所有节点,我们只需要找出二叉树中的满二叉树,满二叉树知道其深度k,可以利用公式2^k-1得到节点个数
- 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
- 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
如果是满二叉树,直接求节点,如果不是,则需要分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
那么如何判断某个树是不是满二叉树
我们只需要判断树的左右最外层是否相等
如,这一种就不等
继续往下找
左边已经找到,计算节点即可,右边继续
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 一般二叉树求解方法def countNodes(self, root: [TreeNode]) -> int:return self.getNum(root)def getNum(self,node):if not node:return 0left = node.leftleftDepth = 1right = node.rightrightDepth = 1# 求左子树深度while left:left = left.leftleftDepth += 1# 求右子树深度while right:right = right.rightrightDepth += 1if leftDepth == rightDepth:return 2**leftDepth - 1return self.getNum(node.left) + self.getNum(node.right) + 1
感想:
这题需要自己多画画图,搞清楚完全二叉树概念,下次碰到,不能想到,就用最直接的二叉树统一方法,能够做出来是第一步,优化是第二步
相关文章:

算法打卡Day14
今日任务: 1)104.二叉树的最大深度 2)559.n叉树的最大深度 3)111.二叉树的最小深度 4)222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接:104. 二叉树的最大深度 - 力扣(LeetCode&#…...
Android Kotlin版封装EventBus
文章目录 Android Kotlin版封装EventBus代码封装添加依赖库定义消息类定义常量值定义注解定义工具类 使用在Activity中在Fragment中发送事件 源码下载 Android Kotlin版封装EventBus 代码封装 添加依赖库 implementation("org.greenrobot:eventbus:3.3.1")定义消息…...
VUE父子组件的传参问题
1.父组件向子组件传参 1)这是一个父组件 //这是一个父组件 <div> <port :port-List"portList" ></port> </div> //port 这是子组件的名称export default{components: {},props: {},data() {return{portList:,}},computed: {}…...

四、C#希尔排序算法
简介 希尔排序简单的来说就是一种改进的插入排序算法,它通过将待排序的元素分成若干个子序列,然后对每个子序列进行插入排序,最终逐步缩小子序列的间隔,直到整个序列变得有序。希尔排序的主要思想是通过插入排序的优势࿰…...
华为认证网络工程师的市场需求大吗?
华为认证网络工程师的市场需求非常旺盛,这主要得益于信息技术的快速发展和网络建设的不断扩展。随着云计算、大数据、物联网等新兴技术的普及,企业对于数据通信和网络技术的需求日益增长,为网络工程师提供了广阔的就业空间。 从行业发展趋势来…...
Pytorch:nn.Upsample() 和nn.ConvTranspose2d()
nn.Upsample 原理 nn.Upsample 是一个在PyTorch中进行上采样(增加数据维度)的层,其通过指定的方法(如nearest邻近插值或linear、bilinear、trilinear线性插值等)来增大tensor的尺寸。这个层可以在二维或三维数据上按…...

百度交易中台之系统对账篇
作者 | 天空 导读 introduction 百度交易中台作为集团移动生态战略的基础设施,面向收银交易与清分结算场景,赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线,主要包括:度小店、小程序、地图打车、文心一言等。本文…...

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级
目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…...

python与excel第一节
python与excel第一节 由于excel在日常办公中大量使用,我们工作中常常会面对高频次或者大量数据的情况。使用python语言可以更加便捷的处理excel。 python与vba的比较 python语法更加简洁,相较于vba冗长复杂的语法,python更加容易学习。 p…...
开发者必备神器 | 全能AI工具助你免费提升开发效率,每日轻松编写代码
全能AI工具助你免费提升开发效率,每日轻松编写代码 前提介绍CodeGeex多语言生成模型支持的编程语言适配多种主流IDE多种IDE插件支持安装VS Code的CodeGeeX插件安装Jetbrains IDEs插件(IntelliJ IDEA,PyCharm)功能实现1. 自动生成和补全代码2. 多语言的代码翻译3. 自动添加注释…...

【RabbitMQ | 第七篇】RabbitMQ实现JSON、Map格式数据的发送与接收
文章目录 7.RabbitMQ实现JSON、Map格式数据的发送与接收7.1消息发送端7.1.1引入依赖7.1.2yml配置7.1.3RabbitMQConfig配置类——(非常重要)(1)创建交换器方法(2)创建队列方法(3)绑定…...

ios symbolicatecrash 符号化crash
一、准备 1.1 .crash 文件获取 设备连接电脑 打开XCode, 依次 XCode -> Windows -> Device and Simulator -> Open Recent Logs 找到 (对应app名+时间点) -> 右键 Show in Finder 1.2 .dSYM 和 .app 文件获取 .dSYM是十六进制函数地址映射信息的中转文件,调试的…...
Rust 语言的 HashMap
HashMap 在 Rust 中是一个非常常用且强大的数据结构,它允许你存储键值对(key-value pairs),并且能够快速地基于键检索值。 下面是使用 HashMap 的一些基本示例: 首先,你需要在你的文件中引入 HashMap: use std::col…...

【目标检测基础篇】目标检测评价指标:mAP计算的超详细举例分析以及coco数据集标准详解(AP/AP50/APsmall.....))
学习视频: 霹雳吧啦Wz-目标检测mAP计算以及coco评价标准 【目标检测】指标介绍:mAP 1 TP/FP/FN TP(True Positive) : IoU>0.5的检测框数量(同一Ground truth只计算一次)FP(False Positive) : IoU<0.5的检测框(或者是检测到同一个GT的多余检测框的…...
服务器与普通电脑的区别,普通电脑是否可以作为服务器使用
服务器在我们日常应用中非常常见,手机APP、手机游戏、PC游戏、小程序、网站等等都需要部署在服务器上,为我们提供各种计算、应用服务。服务器也是计算机的一种,虽然内部结构相差不大,但是服务器的运行速度更快、负载更高、成本更高…...

长安链Docker Java智能合约引擎的架构、应用与规划
#功能发布 长安链3.0正式版发布了多个重点功能,包括共识算法切换、支持java智能合约引擎、支持后量子密码、web3生态兼容等。我们接下来为大家详细介绍新功能的设计、应用与规划。 在《2022年度长安链开源社区开发者调研报告》中,对Java合约语言支持是开…...

STM32 ESP8266模块的曲折探索
这是本文的配套资料,最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s,以下为产品规格书 引脚定义: 依据引脚定义&…...

letcode::根据二叉树创建字符串
根据二叉树创建字符串 题目描述: 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影…...

6个免费的ChatGPT网站
AI 大模型的出现给时代带来了深远的影响: 改变了产业格局:AI 大模型的发展推动了人工智能技术在各行业的广泛应用,改变了传统产业的运作方式,促进了新兴产业的崛起,如智能驾驶、医疗健康、金融科技等。提升了科学研究…...
每天几道面试题|Kafka(一)基础概念
文章目录 什么是 Apache Kafka?它是用来解决什么问题的?Kafka 的主要组件有哪些?它们各自的作用是什么?Kafka 中的生产者和消费者是什么?它们之间的关系是怎样的?Kafka 中的分区是什么?为什么要…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...