二叉树的层序遍历(含八道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.mzph.cn/bicheng/54628.shtml

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

相关文章

240922-局域网内通过SSH与SFTP访问RHEL服务器

要通过SFTP&#xff08;安全文件传输协议&#xff09;在局域网内访问一台RHEL服务器&#xff0c;您需要确保以下步骤都已经正确完成&#xff1a; A. 在RHEL服务器上配置SFTP服务 RHEL默认通过sshd服务提供SFTP功能&#xff0c;SFTP使用SSH协议进行文件传输&#xff0c;因此需要…

【二等奖论文】2024年华为杯研赛D题成品论文(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接获取【2024华为杯研赛资料汇总】&#xff1a; https://qm.qq.com/q/jTIeGzwkSchttps://qm.qq.com/q/jTIeGzwkSc 题 目&#xff1a; 大数据驱动的…

如何理解数据资产?

1.数据分类 对于企业来说&#xff0c;数据的产出创建、应用和管理无处不在。而在使用数据的前提下是必须了解数据&#xff0c;常见的企业数据分为三大类&#xff1a;主数据、业务数据及分析数据。 主数据&#xff1a;企业中的“黄金数据”&#xff0c;它用来承载业务数据和分析…

基于Ambari搭建hadoop生态圈+Centos7安装教程(还没写完,等明天补充完整)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…

WebGL颜色与纹理

WEBGL中的着色器变量包括以下种类&#xff1a; 属性变量&#xff08;Attribute Variables&#xff09;&#xff1a;这些变量用于接收从应用程序中传递的顶点数据&#xff0c;比如顶点位置和颜色&#xff0c;是只读的不可修改。统一变量&#xff08;Uniform Variables&#xff…

小红书自动化写文以及发文机器人

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

Pinia:Vue.js 状态管理的新选择

目录 1.前言 2.Pinia 的核心概念 3.安装 Pinia 4.创建和使用 Store 5.为什么选择 Pinia&#xff1f; 6.结论 1.前言 在 Vue.js 的生态系统中&#xff0c;状态管理是一个核心概念&#xff0c;尤其是对于复杂的单页应用&#xff08;SPA&#xff09;。随着 Vue 3 的推出&…

解决前端下载特殊文件404问题(以Kestrel 服务器为例)

在某些情况下前端需要将服务器上的静态文件下载到本地&#xff0c;对于大部分文件通过HTTP Get方法就可以直接下载&#xff0c;但是有些特殊的静态文件&#xff08;例如.py文件&#xff0c;.cs文件等&#xff09;我们下载时会返回404找不到文件&#xff0c;下面我们以Kestrel 服…

[数据集][目标检测]红外微小目标无人机直升机飞机飞鸟检测数据集VOC+YOLO格式7559张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7559 标注数量(xml文件个数)&#xff1a;7559 标注数量(txt文件个数)&#xff1a;7559 标注…

Vue主题色实现

主题色实现 情境 配置平台支持多个主题色的选择&#xff0c;用户可通过在配置平台选择项目主题色。前端项目在骨架屏加载页面获取配置信息&#xff0c;设置项目主题色&#xff0c;实现同个项目不同主题色渲染的需求 实现 1.定义主题色变量 不同主题色根据不同js文件划分定…

Java ETL - Apache Beam 简介

基本介绍 Apache Beam是一个用于大数据处理的开源统一编程模型。它允许用户编写一次代码&#xff0c;然后在多个批处理和流处理引擎上运行&#xff0c;如Apache Flink、Apache Spark和Google Cloud Dataflow等。Apache Beam提供了一种简单且高效的方式来实现数据处理管道&…

使用python操作数据库

文章目录 一、问题背景二、安装python三、代码示例四、总结 一、问题背景 在日常开发过程中&#xff0c;随着项目进展和业务功能的迭代&#xff0c;我们需要对数据库的表结构进行修改&#xff0c;向部分表中追加字段&#xff0c;并对追加后的字段进行数据填充。但是如果需要追加…

C++ STL之队列queue和双端队列deque

一. 概述 1.1 queue std::queue 是 C STL 中的一个容器适配器&#xff0c;用于实现先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的数据结构&#xff0c;它允许在一端添加元素&#xff08;称为队尾&#xff09;&#xff0c;并在另一端移除元素&#x…

《算法笔记》例题解析 第3章入门模拟--4日期处理(9题)2021-03-03

日期 题目描述 Time Limit: 1000 ms Memory Limit: 256 mb 今天是2012年4月12日星期四&#xff0c;编写程序&#xff0c;输入今天开始到12月31日之间的任意日期&#xff0c;输出那一天是星期几。例如输入“5&#xff08;回车&#xff09;20&#xff08;回车&#xff09;”&am…

DETR论文翻译与理解

DETR&#xff08;Detection with transformer&#xff09; DETR&#xff1a;End to End Object Detection with Transformer 论文链接&#xff1a;2005.12872 (arxiv.org) 参考视频&#xff1a;https://www.bilibili.com/video/BV1GB4y1X72R/?spm_id_from333.788&vd_…

C++学习笔记(37)

302、makefile 在实际开发中&#xff0c;项目的源代码文件比较多&#xff0c;按类型、功能、模块分别存放在不同的目录和文件中&#xff0c;哪 些文件需要先编译&#xff0c;那些文件后编译&#xff0c;那些文件需要重新编译&#xff0c;还有更多更复杂的操作。 make 是一个强大…

mysql性能优化- 数据库配置优化

MySQL 性能优化 - 数据库配置优化 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;但随着数据量的增长和访问频率的提高&#xff0c;其性能可能会成为瓶颈。为了保持高效的性能&#xff0c;除了应用层的查询优化和索引优化之外&#xff0c;数据库配置优化 也是非常重…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

爵士编曲:爵士鼓编写 爵士鼓笔记 底鼓和军鼓 闭镲和开镲 嗵鼓

底鼓和军鼓 底鼓通常是动的音色&#xff0c;军鼓通常是大的音色。 “动”和“大”构成基础节奏。“动大”听着不够有连接性&#xff0c;所以可以加入镲片&#xff01; 开镲 直接鼓棒敲击是开镲音色 闭镲 当脚踩下踏板&#xff0c;2个镲片合并&#xff0c;然后用鼓棒敲击&am…

C++ Linux IPC进程通信-消息队列MQ

原文链接&#xff1a;C Linux IPC进程通信-消息队列MQ 消息队列库<sys/msg.h> 相比于共享内存和管道,消息队列能够实现指定的消息格式和排序,能实现更复杂的通信 库函数 // 创建消息队列 int msgget(key_t, key, int msgflg); return ID(成功) -1(错误)key为一个标记…