二叉树的层序遍历(含八道leetcode相关题目)

文章目录

  • 二叉树层序遍历模板
  • 102. 二叉树的层序遍历
  • 107. 二叉树的层序遍历 II
  • 199. 二叉树的右视图
  • 637. 二叉树的层平均值
  • 515. 在每个树行中找最大值
  • 429. N 叉树的层序遍历
  • 116. 填充每个节点的下一个右侧节点指针
  • 117. 填充每个节点的下一个右侧节点指针 II

二叉树层序遍历模板

我们之前讲过了关于二叉树的深度优先遍历的文章:前中后序遍历的递归法和迭代法。

接下来我们再来介绍二叉树的另一种遍历方式:层序遍历

层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。

在这里插入图片描述
如图所示:将每层的元素从左至右加入队列,取出时就会先取出左节点,并将当前节点的左右节点又加入队尾,接着从队列取出下一个元素,将它的左右节点同样加入队尾,以此类推。那怎么确认取出多少个元素的时候可认为当前层的元素都取完了呢?这就需要一个变量来记录啦,这个变量其实就是每轮循环开始时队列的长度,当前长度就是当前层的所有元素,该轮循环的后续操作就是将下一层的所有节点加入队尾。

这样就实现了层序从左到右遍历二叉树。

代码如下:这份代码也可以作为二叉树层序遍历的模板,打十个就靠它了。

Go代码如下

102. 二叉树的层序遍历

迭代法

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]int,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:len(queue)]curLevelRes = append(curLevelRes,curNode.Val)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,将当前层结果加入最终结果中res = append(res,curLevelRes)}return res
}

递归法

// 层序遍历递归法
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)preOrder(root,0,&res) //根节点在第0层return res
}/*直接使用二叉树的前序遍历的递归形式即可,只是递归的时候,要多传一个参数,就是该节点属于第几层的,很简单,子节点所在层数是父节点所在层数加一*/
func preOrder(node *TreeNode,level int,res *[][]int) {//如果level是新层,则在res中继续添加一个[]int用于存这一次的结点的值if len(*res) == level {culLevelRes := make([]int,0)*res = append(*res,culLevelRes)}//将结点的值添加到res中对应的层的[]int中(*res)[level] = append((*res)[level],node.Val)//递归遍历左右子节点if node.Left != nil {preOrder(node.Left,level + 1,res)}if node.Right != nil {preOrder(node.Right,level + 1,res)}
}

在这里插入图片描述

102. 二叉树的层序遍历

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例 1:
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

Go 代码迭代法

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]int,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:len(queue)]curLevelRes = append(curLevelRes,curNode.Val)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,将当前层结果加入最终结果中res = append(res,curLevelRes)}return res
}

在这里插入图片描述

Go代码递归法

// 层序遍历递归法
func levelOrder(root *TreeNode) [][]int {if root == nil {return [][]int{}}res := make([][]int,0)preOrder(root,0,&res) //根节点在第0层return res
}/*直接使用二叉树的前序遍历的递归形式即可,只是递归的时候,要多传一个参数,就是该节点属于第几层的,很简单,子节点所在层数是父节点所在层数加一*/
func preOrder(node *TreeNode,level int,res *[][]int) {//如果level是新层,则在res中继续添加一个[]int用于存这一次的结点的值if len(*res) == level {culLevelRes := make([]int,0)*res = append(*res,culLevelRes)}//将结点的值添加到res中对应的层的[]int中(*res)[level] = append((*res)[level],node.Val)//递归遍历左右子节点if node.Left != nil {preOrder(node.Left,level + 1,res)}if node.Right != nil {preOrder(node.Right,level + 1,res)}
}

在这里插入图片描述

107. 二叉树的层序遍历 II

107. 二叉树的层序遍历 II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

Go代码

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func levelOrderBottom(root *TreeNode) [][]int {// 和102题一样,就是普通的层序遍历,不过遍历完成后,结果需要倒序一下if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) > 0 {queueSize := len(queue)curLevelRes := make([]int,0)for i := 0;i < queueSize;i++{curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode.Val)if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}res = append(res,curLevelRes)}// 反转结果left := 0right := len(res)-1for left < right {res[left],res[right] = res[right],res[left]left++right--}return res
}

在这里插入图片描述

199. 二叉树的右视图

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

在这里插入图片描述

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

Go代码

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func rightSideView(root *TreeNode) []int {// 层序遍历之后,返回每层最后一个元素即可if root == nil {return []int{}}res := make([]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) > 0 {queueSize := len(queue)curLevelRes := make([]int,0)for i := 0;i < queueSize;i++{curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode.Val)if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 只保留当前层最右边的元素,即当前层最后一个元素res = append(res,curLevelRes[len(curLevelRes) - 1])}return res
}

在这里插入图片描述

637. 二叉树的层平均值

637. 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 1 0 − 5 10^{-5} 105 以内的答案可以被接受。

示例 1:
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,1 层的平均值为 14.5,2 层的平均值为 11 。
因此返回 [3, 14.5, 11]

示例 2:
在这里插入图片描述

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -2^31 <= Node.val <= 2^31 - 1

Go代码

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func averageOfLevels(root *TreeNode) []float64 {// 层序遍历之后,返回每层的平均值即可if root == nil {return []float64{}}res := make([]float64,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) > 0 {queueSize := len(queue)curLevelRes := make([]int,0)for i := 0;i < queueSize;i++{curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode.Val)if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 只保留当前层最右边的元素,即当前层最后一个元素res = append(res,getAvgOfArr(curLevelRes))}return res
}func getAvgOfArr(arr []int) float64 {sum := 0for _,num:= range arr {sum += num}return float64(sum) / float64(len(arr))
}

在这里插入图片描述

515. 在每个树行中找最大值

515. 在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

  • 二叉树的节点个数的范围是 [ 0 , 1 0 4 ] [0,10^4] [0,104]
  • − 2 31 < = N o d e . v a l < = 2 31 − 1 -2^{31} <= Node.val <= 2^{31} - 1 231<=Node.val<=2311

Go代码

代码和637题几乎一样

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func largestValues(root *TreeNode) []int {// 层序遍历之后,返回每层的最大值即可if root == nil {return []int{}}res := make([]int,0)queue := make([]*TreeNode,0)queue = append(queue,root)for len(queue) > 0 {queueSize := len(queue)curLevelRes := make([]int,0)for i := 0;i < queueSize;i++{curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode.Val)if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 只保留当前层最右边的元素,即当前层最后一个元素res = append(res,getMaxOfArr(curLevelRes))}return res
}func getMaxOfArr(arr []int) int {maxVal := arr[0]for _,num:= range arr {if num > maxVal {maxVal = num}}return maxVal
}

在这里插入图片描述

429. N 叉树的层序遍历

429. N 叉树的层序遍历

给定一个N叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由null值分隔(参见示例)。

示例 1:

在这里插入图片描述

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:
在这里插入图片描述

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 10^4] 之间

Go 代码

/*** Definition for a Node.* type Node struct {*     Val int*     Children []*Node* }*/func levelOrder(root *Node) [][]int {// 思路和102题二叉树的层序遍历是一模一样的if root == nil {return [][]int{}}res := make([][]int,0)queue := make([]*Node,0)queue = append(queue,root)for len(queue) > 0 {curLevelRes := make([]int,0)queueSize := len(queue)for i := 0;i < queueSize;i++ {curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode.Val)// 下一层,与二叉树层序遍历的唯一区别for j := 0;j < len(curNode.Children);j++{queue = append(queue,curNode.Children[j])}}res = append(res,curLevelRes)}return res
}

在这里插入图片描述

116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:
在这里插入图片描述

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next指针连接,‘#’ 标志着每一层的结束。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中节点的数量在 [0, 2^12 - 1] 范围内
  • -1000 <= node.val <= 1000

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

Go 代码

/*** Definition for a Node.* type Node struct {*     Val int*     Left *Node*     Right *Node*     Next *Node* }*/func connect(root *Node) *Node {if root == nil {return nil}queue := make([]*Node,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]*Node,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,当前层的节点前一个节点的Next连接同层节点的下一个节点for i := 0;i < len(curLevelRes) - 1;i++ {curLevelRes[i].Next = curLevelRes[i+1]}}return root
}

在这里插入图片描述

117. 填充每个节点的下一个右侧节点指针 II

117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树:

struct Node {int val;Node *left;Node *right;Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),‘#’ 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

提示:

  • 树中的节点数在范围 [0, 6000] 内
  • -100 <= Node.val <= 100

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度。

Go代码

与116题代码一模一样

/*** Definition for a Node.* type Node struct {*     Val int*     Left *Node*     Right *Node*     Next *Node* }*/func connect(root *Node) *Node {if root == nil {return nil}queue := make([]*Node,0)queue = append(queue,root)for len(queue) != 0 {// 当前层的元素个数,以及定义存当前层结果的数组queueSize := len(queue)curLevelRes := make([]*Node,0)// 取出当前层所有元素,并依次加入下一层的元素for i := 0; i < queueSize ;i++ {curNode := queue[0]queue = queue[1:]curLevelRes = append(curLevelRes,curNode)// 当前节点的左右节点加入队列if curNode.Left != nil {queue = append(queue,curNode.Left)}if curNode.Right != nil {queue = append(queue,curNode.Right)}}// 当前层遍历完成,当前层的节点前一个节点的Next连接同层节点的下一个节点for i := 0;i < len(curLevelRes) - 1;i++ {curLevelRes[i].Next = curLevelRes[i+1]}}return root
}

在这里插入图片描述

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

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

相关文章

基于Java springboot+mybatis 网上商城系统

基于Java springbootmybatis 网上商城系统 一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.注册&#xff08;客户&#xff09;4.购物车(客户)5.我的订单&#xff08;客户&#xff09;6.用户管理&#xff08;管理员&#xff09;7.分类管理&#xff0…

Cisco 基础网络汇总

⭕个人主页 可惜已不在 ⭕可以分享给身边有需要的人 ⭕有用的话就留下一个三连吧 目录 前言: 一.网络及网络设备认识 二. 二层网络 三. 生成树、端口 四. 三层网络 五.访问控制 六.NAT 七.DHCP 八.PPP 九.帧中继 十.热备份 十一.综合实验 十二.WLAN 十三.Cisco P…

华为全联接大会HUAWEI Connect 2024印象(一):OpenEuler

因为和华为有课程合作&#xff0c;此次应邀参加了华为全联接大会 &#xff08;HUAWEI Connect 2024&#xff09;&#xff0c;分几次分享一下自己的见闻。 HUAWEI Connect 2024的规模很大&#xff0c;不过主要面向的应该是企业市场&#xff0c;我比较关注的嵌入式系统的内容很少…

OpenAI o1-preview和o1-mini现已在 GitHub Copilot和GitHub Models中提供

微软 GitHub 今天宣布在 GitHub Copilot和 Models 中提供两个新的 Open AI 模型&#xff1a;o1-preview 和 o1-mini。OpenAI 推出了新的 o1 系列 人工智能模型&#xff0c;旨在花更多时间思考后再做出反应。与以前的 OpenAI 模型相比&#xff0c;这些模型能在科学、编码和数学领…

C++速通LeetCode中等第18题-删除链表的倒数第N个结点(最简单含注释)

绝妙&#xff01;快慢指针法,快指针先走n步&#xff08;复杂度O(n),O(1))&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…

使命召唤游戏助手系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;玩家管理&#xff0c;游戏分类管理&#xff0c;道具种类管理&#xff0c;游戏道具处管理&#xff0c;战绩信息管理&#xff0c;水平评估管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统…

Spring源码-从源码层面讲解声明式事务的运行流程

TxTest开始执行事务方法: public class TxTest {public static void main(String[] args) throws SQLException {System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"d:\\code");ApplicationContext context new ClassPathXmlApplicationContext(&…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术&#xff0c;tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域&#xff0c;如何把核苷酸或氨基酸序列tokenization成token呢&#xff1f; 我们可以使用k-mer技术&#xff1a; k-m…

基于 Qwen2-1.5B Lora 微调训练医疗问答任务

一、Qwen2 Lora 微调 Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。Qwen2 是 Qwen1.5 的重大升级。无论是语言模型还是多模态模型&#xff0c;均在大规模多语言和多模态数据上进行预训练&#xff0c;并通过高质量数据进行后期微调以贴近人类偏好。Qwen具…

DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。 比如&#xff1a;delphi XE12 是 36 &#xff0c;也仅此而己。 我想得到的是IDE的版本号&#xff0c;比如当前最新版本的DELPHI是&#xff1a;Embarcadero RAD Studio 12 Version 29.0.53571.9782 我想得到 29.0.53…

【JAVA开源】基于Vue和SpringBoot的网上超市系统

本文项目编号 T 037 &#xff0c;文末自助获取源码 \color{red}{T037&#xff0c;文末自助获取源码} T037&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

16【Protues51单片机仿真】智能洗衣机倒计时系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 用直流电机转动模拟洗衣机。要求 有弱洗、普通洗、强洗三种模式&#xff0c;可通过按键选择。可以设置洗衣时长&#xff0c;通关按键选择15、30、45、60、90分钟。时间到蜂鸣器报警提示。LCD 显示…

Webui 显卡有显存,会报错:CUDA out of memory

Webui 显卡明明有显存&#xff0c;会报错&#xff1a;CUDA out of memory 网上找了很多资料&#xff0c;都没有能解决这个问题 &#xff0c;后来发现和电脑虚拟内存设置有关&#xff0c;这里记录一下具体的解决方法&#xff1a; 什么是 CUDA Out of Memory 错误&#xff1f; …

SAP B1 Web Client MS Teams App集成连载三

过程/Procedure&#xff1a; 1.在应用商店中&#xff0c;点击启动 SAP Business One 应用。应用详细信息页面显示如下。 In the Apps store, click SAP Business One app to launch it. The app details page is displayed as below 2.在左上角&#xff0c;有一个包含两个选项的…

淘宝扭蛋机小程序,扭蛋机文化下的新体验

在数字化时代中&#xff0c;扭蛋机逐渐从传统的线下机器转移到了线上互联网中&#xff0c;市场得到了创新发展。扭蛋机小程序具有便捷、多样化、个性化的特点&#xff0c;迎合了当下消费者的线上消费习惯&#xff0c;又能够让扭蛋机玩家体验到新鲜有趣的扭蛋。 扭蛋机是一种热…

光伏板缺陷红外检测数据集

光伏板缺陷红外检测数据集 包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统…

PCIE集成验证(五)MSI/MSI-X中断

PCI 总线最早采用的中断机制是 INTx&#xff0c;这是基于边带信号的。后续的 PCI/PCI-X版本&#xff0c;为了消除边带信号&#xff0c;降低系统的硬件设计复杂度&#xff0c;逐渐采用了 MSI(Message Signaled Interrupt)/MSI-X&#xff08;消息信号中断&#xff09;的中断机制。…

救生圈检测系统源码分享

救生圈检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

使用Renesas R7FA8D1BH (Cortex®-M85)和微信小程序App数据传输

目录 概述 1 系统架构 1.1 系统结构 1.2 系统硬件框架结构 1.3 蓝牙模块介绍 2 微信小程序实现 2.1 UI介绍 2.2 代码实现 3 上位机功能实现 3.1 通信协议 3.2 系统测试 4 下位机功能实现 4.1 功能介绍 4.2 代码实现 4.3 源代码文件 5 测试 5.1 编译和下载代码…

微服务基础设施选型

微服务基础设施架构 微服务基础设施架构全貌 微服务 vs SOA (Round 2) 微服务数量越多越复杂 微服务 vs SOA (Round 3) 微服务把服务的粒度变小&#xff0c;进行了标准化拆分。同时也将ESB拆分为了微服务。 微服务基础设施优先级 这里面体现了基础设施的优先级&#xff0c;如…