【Python 数据结构 10.二叉树】
目录
一、二叉树的基本概念
1.二叉树的定义
2.二叉树的特点
3.特殊的二叉树
Ⅰ、斜树
Ⅱ、满二叉树
Ⅲ、完全二叉树
Ⅳ、完全二叉树和满二叉树的区别
4.二叉树的性质
5.二叉树的顺序存储
Ⅰ、完全二叉树
Ⅱ、非完全二叉树
Ⅲ、稀疏二叉树
6.二叉树的链式存储
7.二叉树的遍历概念
8.二叉树的前序遍历
9.二叉树的中序遍历
10.二叉树的后序遍历
11.二叉树的层序遍历
二、Python中的二叉树
1.树的结点定义
2.树的定义
Ⅰ、初始化
Ⅱ、根据给定的结点ID从树结构中获取对应的结点
Ⅲ、访问函数,打印元素结点值
Ⅳ、根据数组创建二叉树
Ⅴ、先序遍历
Ⅵ、中序遍历
Ⅶ、后序遍历
三、实战
1.144. 二叉树的前序遍历
方法一 递归
思路与算法
编辑
方法二 用栈 Stack 实现迭代遍历
思路与算法
2.94. 二叉树的中序遍历
方法一 递归
思路与算法
方法二 用栈实现迭代
思路与算法
3.145. 二叉树的后序遍历
方法一 递归
思路与算法
方法二 用栈实现迭代
思路与算法
等你读懂了相遇的意义,有了隔阂别放弃
—— 25.3.8
一、二叉树的基本概念
1.二叉树的定义
二叉树是 n(n ≥ 0) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根节点和两棵互不相交的二叉树组成,其中这两棵互不相交的二叉树被称为根节点的左子树和右子树
如图所示,2 是 1 的左子树,3 是 1 的右子树;同时,4 和 5 分别是 2 的左右子树,6 和 7分别是 3 的左右子树

2.二叉树的特点
二叉树是一种树,它有如下几个特征:
① 每个结点最多二棵子树,即每个结点的孩子结点个数为 0、1、2.
② 这两棵子树是有顺序的,分别叫:左子树 和 右子树,就像左手和右手一样,是不能颠倒
的。
③ 如果只有一棵子树的情况,也需要区分顺序,如图所示:
b 是 a 的左子树
c 是 a 的右子树
3.特殊的二叉树
Ⅰ、斜树
所有结点都只有左子树的二叉树,被称为左斜树

所有结点都只有右子树的二叉树,被称为右斜树

斜树有点类似 线性表,所以线性表可以理解为一种特殊形式的树
Ⅱ、满二叉树
对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树

满二叉树有如下几个特点:
① 叶子节点一定在最后一层
② 非叶子结点的度为 2
③ 深度相同的二叉树中,满二叉树的结点个数最多,为 2 ^ h - 1(其中 h 代表树的深度)
Ⅲ、完全二叉树
对一颗具有 n 个结点的二叉树,按照层序进行编号,如果编号 i 的结点 和 同样深度的满二叉树中的编号 i 的结点在二叉树中,位置完全相同则被称为 完全二叉树

Ⅳ、完全二叉树和满二叉树的区别
满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树,完全二叉树有如下几个特
点:
① 叶子结点只能出现在最下面两层
② 最下层的叶子结点,一定是集中在左边的连续位置,倒数第二层如果有叶子结点一定集中在右边的连续位置
③ 如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况
④ 同样结点数的二叉树,完全二叉树的深度最小
如下图所示,就不是一棵完全二叉树,因为5号结点没有右子树,但是6号结点是有左子树的,不满足上述第 2 点。

4.二叉树的性质
① 二叉树的第 i (i >= 1) 层上最多 2 ^ (i - 1) 个结点;
② 深度为 h 的二叉树至多 2 ^ h - 1 个结点;
③ n个结点的完全二叉树的深度为 floor(log2n) + 1(其中 floor(x) 代表对 x 取下整);
5.二叉树的顺序存储
二叉树的顺序存储就是指:利用顺序表对二叉树进行存储。结点的存储位置即顺序表的索引,能够体现结点之间的逻辑关系比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等。
Ⅰ、完全二叉树

编号代表了顺序表索引的绝对位置,映射后如下:

为了方便,将顺序表索引为 0 的位置留空
当知道某个结点在顺序表中的索引 x,就可以知道它左右儿子的索引分别为 2x 和 2x + 1.反之,当知道某个结点的索引 x,也能知道其父节点的索引为 floor(x / 2)
Ⅱ、非完全二叉树
对于非完全二叉树,只需要将对应不存在的结点设置为空即可

编号代表了顺序表索引的绝对位置,映射后如下:

Ⅲ、稀疏二叉树
对于较为稀疏的二叉树,就会有如下情况出现,这时候如果用这种方式进行存储,就比较浪费内存了

编号代表了顺序表索引的绝对位置,映射后如下:

这种情况下,为了提升内存利用率,我们可以采用链表进行存储
6.二叉树的链式存储
二叉树每个结点至多有两个孩子结点,所以对于每个结点设置一个数据域(data) 和 两个指针域(left 和 right) 即可。指针域 分别指向 左孩子结点 和 右孩子结点。
7.二叉树的遍历概念
二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点访问一次且仅被访问一次。
对于线性表的遍历,要么从头到尾,要么从尾到头,遍历方式较为单纯。但是树不一样,它的每个结点都有可能有两个孩子结点,所以遍历的顺序面临着不同的选择。
二叉树的常用遍历方法,有以下四种:前序遍历、中序遍历、后序遍历、层序遍历。

编号代表了顺序表索引的绝对位置,映射后如下:

8.二叉树的前序遍历
如果二叉树为空则直接返回,否则先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。(根、左、右)前序遍历的结果如下:a、b、d、g、h、c、e、f、i

9.二叉树的中序遍历
如果二叉树为空则直接返回,否则先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。(左、根、右)中序遍历的结果如下:g、d、h、b、a、e、c、i、f

10.二叉树的后序遍历
如果二叉树为空则直接返回,否则先递归后遍历左子树,再递归后序遍历右子树,再访问根结点。(左、右、根)后序遍历的结果如下:g、h、d、b、e、i、f、c、a

11.二叉树的层序遍历
如果二叉树为空直接返回,否则依次从树的第一层开始,从上至下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。图中二叉树层序遍历的结果为:a、b、c、d、e、f、g、h、i

二、Python中的二叉树
1.树的结点定义
val:存放当前结点的value值
left:存放当前节点的左孩子
right:存放当前节点的右孩子
class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right
2.树的定义
Ⅰ、初始化
接收参数 maxNodes,传入结点最大数目
列表推导式:
class Tree:def __init__(self, maxNodes):self.root = Noneself.nodes = [TreeNode() for i in range(maxNodes)]self.nodeSize = maxNodes
Ⅱ、根据给定的结点ID从树结构中获取对应的结点
# 根据给定的节点ID从树结构中获取对应的节点def GetTreeNode(self, id):return self.nodes[id]
Ⅲ、访问函数,打印元素结点值
# 访问函数,打印元素结点的值def visit(self, node):print(node.val, end=' ')
Ⅳ、根据数组创建二叉树
# 传入一个数组,根据数组创建二叉树def Create(self, arr, size, nodeId):if nodeId >= size or arr[nodeId] == None:return NonenowNode = self.GetTreeNode(nodeId)nowNode.val = arr[nodeId]nowNode.left = self.Create(arr, size, 2 * nodeId)nowNode.right = self.Create(arr, size, 2 * nodeId + 1)return nowNode
Ⅴ、先序遍历
# 先序遍历def PreOrder(self, node):if node != None:self.visit(node)self.PreOrder(node.left)self.PreOrder(node.right)def preOrderTraversal(self):self.PreOrder(self.root)print('')
Ⅵ、中序遍历
# 中序遍历def InOrder(self, node):if node != None:self.InOrder(node.left)self.visit(node)self.InOrder(node.right)def InOrderTraversal(self):self.InOrder(self.root)print('')
Ⅶ、后序遍历
# 后序遍历def PostOrder(self, node):if node != None:self.PostOrder(node.left)self.PostOrder(node.right)self.visit(node)def PostTraversal(self):self.PostOrder(self.root)print('')
Ⅷ、测试代码
def Test():arr = [None, 'a', 'b', 'c', 'd', None, 'e', 'f', 'g', 'h', None, None, None, None, 'i']tree = Tree(len(arr))tree.CreateTree(arr)tree.preOrderTraversal()tree.InOrderTraversal()tree.PostTraversal()Test()

三、实战
1.144. 二叉树的前序遍历
给你二叉树的根节点
root,返回它节点值的 前序 遍历。示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
解释:
示例 2:
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[1,2,4,5,6,7,3,8,9]
解释:
示例 3:
输入:root = []
输出:[]
示例 4:
输入:root = [1]
输出:[1]
提示:
- 树中节点数目在范围
[0, 100]内-100 <= Node.val <= 100进阶:递归算法很简单,你可以通过迭代算法完成吗?
方法一 递归
思路与算法
- 前序遍历遵循“根 -> 左 -> 右”的顺序。
- 递归函数
preorder的核心逻辑是:- 如果当前节点
root不为空,则将其值加入结果列表ret。 - 递归遍历左子树。
- 递归遍历右子树。
- 如果当前节点
- 递归终止条件是当前节点为空(
root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def preorder(self, root:Optional[TreeNode], ret:List[int]):if root:ret.append(root.val)self.preorder(root.left, ret)self.preorder(root.right, ret)def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:ret = []self.preorder(root, ret)return ret
方法二 用栈 Stack 实现迭代遍历
思路与算法
- 前序遍历遵循“根 -> 左 -> 右”的顺序。
- 使用栈来模拟递归的过程:
- 从根节点开始,将当前节点的值加入结果列表
res,并将当前节点入栈。 - 遍历左子树,直到左子树为空。
- 回溯到上一个节点(通过栈弹出),并遍历其右子树。
- 从根节点开始,将当前节点的值加入结果列表
- 重复上述过程,直到栈为空且当前节点为空。

2.94. 二叉树的中序遍历
给定一个二叉树的根节点
root,返回 它的 中序 遍历 。示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]提示:
- 树中节点数目在范围
[0, 100]内-100 <= Node.val <= 100进阶: 递归算法很简单,你可以通过迭代算法完成吗?
方法一 递归
思路与算法
- 后序遍历遵循“左 -> 右 -> 根”的顺序。
- 递归函数
PostOrder的核心逻辑是:- 如果当前节点
root不为空,则递归遍历其左子树。 - 递归遍历其右子树。
- 将当前节点的值加入结果列表
res。
- 如果当前节点
- 递归终止条件是当前节点为空(
root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def PostOrder(self, root:Optional[TreeNode], res:List[int]):if root:self.PostOrder(root.left, res)self.PostOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.PostOrder(root, res)return res

方法二 用栈实现迭代
思路与算法
- 中序遍历遵循“左 -> 根 -> 右”的顺序。
- 使用栈来模拟递归的过程:
- 从根节点开始,将当前节点入栈,并遍历其左子树,直到左子树为空。
- 回溯到上一个节点(通过栈弹出),将其值加入结果列表
res。 - 遍历其右子树。
- 重复上述过程,直到栈为空且当前节点为空。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res, stack = [], []while root or stack:if root:stack.append(root)root = root.leftelse: root = stack.pop()res.append(root.val)root = root.rightreturn res
3.145. 二叉树的后序遍历
给你一棵二叉树的根节点
root,返回其节点值的 后序遍历 。示例 1:
输入:root = [1,null,2,3]
输出:[3,2,1]
解释:
示例 2:
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[4,6,7,5,2,9,8,3,1]
解释:
示例 3:
输入:root = []
输出:[]
示例 4:
输入:root = [1]
输出:[1]
提示:
- 树中节点的数目在范围
[0, 100]内-100 <= Node.val <= 100进阶:递归算法很简单,你可以通过迭代算法完成吗?
方法一 递归
思路与算法
- 后序遍历遵循“左 -> 右 -> 根”的顺序。
- 递归函数
postOrder的核心逻辑是:- 如果当前节点
root不为空,则递归遍历其左子树。 - 递归遍历其右子树。
- 将当前节点的值加入结果列表
res。
- 如果当前节点
- 递归终止条件是当前节点为空(
root is None),此时直接返回。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def postOrder(self, root:TreeNode, res):if root is None:returnself.postOrder(root.left, res)self.postOrder(root.right, res)res.append(root.val)def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []self.postOrder(root, res)return res

方法二 用栈实现迭代
思路与算法
- 后序遍历遵循“左 -> 右 -> 根”的顺序。
- 使用栈来模拟递归的过程:
- 从根节点开始,将当前节点入栈,并遍历其左子树,直到左子树为空。
- 如果左子树为空,则遍历其右子树。
- 回溯到上一个节点(通过栈弹出),将其值加入结果列表
res。 - 如果当前节点是栈顶节点的左子节点,则继续遍历栈顶节点的右子树;否则,结束当前分支的遍历。
- 重复上述过程,直到栈为空且当前节点为空。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:res = []stack = []node = rootwhile stack or node:while node:stack.append(node)if node.left != None:node = node.leftelse:node = node.rightnode = stack.pop()res.append(node.val)if stack and stack[-1].left == node:node = stack[-1].rightelse:node = Nonereturn res

相关文章:
【Python 数据结构 10.二叉树】
目录 一、二叉树的基本概念 1.二叉树的定义 2.二叉树的特点 3.特殊的二叉树 Ⅰ、斜树 Ⅱ、满二叉树 Ⅲ、完全二叉树 Ⅳ、完全二叉树和满二叉树的区别 4.二叉树的性质 5.二叉树的顺序存储 Ⅰ、完全二叉树 Ⅱ、非完全二叉树 Ⅲ、稀疏二叉树 6.二叉树的链式存储 7.二叉树的遍历概念…...
SwanLab简明教程:从萌新到高手
目录 1. 什么是SwanLab? 1.1 核心特性 2. 安装SwanLab 3. 登录SwanLab账号(云端版) 4. 5分钟快速上手 更多案例 5. SwanLab功能组件 5.1 图表视图 5.2 表格视图 5.3 硬件监控 5.4 环境记录 5.5 组织协同 6. 训练框架集成 6.1 基…...
SQLiteStudio:一款免费跨平台的SQLite管理工具
SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面,简化了数据库的创建、编辑、查询和维护,适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括: 免费开源,可…...
【智能体Agent】ReAct智能体的实现思路和关键技术
基于ReAct(Reasoning Acting)框架的自主智能体 import re from typing import List, Tuplefrom langchain_community.chat_message_histories.in_memory import ChatMessageHistory from langchain_core.language_models.chat_models import BaseChatM…...
python爬虫系列课程8:js浏览器window对象属性
python爬虫系列课程8:js浏览器window对象属性 一、JavaScript的组成二、document常见属性对象三、navigator对象一、JavaScript的组成 JavaScript可以分为三个部分:ECMAScript标准、DOM、BOM。 ECMAScript标准:即JS的基本语法,JavaScript的核心,描述了语言的基本语法和数…...
Java基础系列:深入理解八大基本数据类型及避坑指南
目录 一、基本数据类型概述 八大类型速查表 二、各类型详解与常见陷阱 1. 整型家族(byte/short/int/long) 2. 浮点型(float/double) 3. 字符型(char) 4. 布尔型(boolean) 三…...
贝塞尔曲线学习
1、一阶贝塞尔曲线 一阶贝塞尔曲线其实是一条直线——给定点 P0、P1,线性贝塞尔曲线就是一条两点之间的直线,公式如下: 一阶曲线很好理解, 就是根据t来线性插值。 void MainWindow::mousePressEvent(QMouseEvent *e) {list.append(e->pos…...
机器学习(六)
一,决策树: 简介: 决策树是一种通过构建类似树状的结构(颠倒的树),从根节点开始逐步对数据进行划分,最终在叶子节点做出预测结果的模型。 结构组成: 根节点:初始的数据集…...
kotlin高级用法总结
Kotlin 是一门功能强大且灵活的编程语言,除了基础语法外,它还提供了许多高级特性,可以帮助你编写更简洁、高效和可维护的代码。以下是 Kotlin 的一些高级用法,涵盖了协程、扩展函数、属性委托、内联类、反射等内容。 协程&#x…...
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 引言 OCPP作为开放协议,其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求,OCPP通过**扩展点(Extension Points)…...
docker目录挂载与卷映射的区别
在 Docker 中,目录挂载(Bind Mount)和卷映射(Volume Mount)的命令语法差异主要体现在路径格式上,具体表现为是否以斜杠(/)开头。以下是两者的核心区别及使用场景的总结: …...
【江协科技STM32】ADC数模转换器-学习笔记
ADC简介 ADC(Analog-Digital Converter)模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁,ADC是一种将连续的模拟信号转换为离散的数字信号的设备或模块12位逐次逼近型…...
【kubernetes】service
目录 1. 说明2. 原理2.1 服务注册2.2 服务发现2.3 负载均衡 3. Service的类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4. 使用场景 1. 说明 1.kubernetes中的service主要用于提供网络服务,并实现微服务架构中的几个核心功能:全自动…...
嵌入式学习笔记-卡尔曼滤波,PID,MicroPython
文章目录 卡尔曼滤波卡尔曼滤波的核心思想卡尔曼滤波的数学模型1. 状态转移模型(预测系统状态)2. 观测模型(预测测量值) 卡尔曼滤波的五个关键步骤1. 预测状态2. 预测误差协方差3. 计算卡尔曼增益4. 更新状态5. 更新误差协方差 卡…...
什么是hive
Apache Hive 是一个基于 Hadoop 生态系统构建的数据仓库工具,主要用于处理和分析大规模的结构化数据。它允许用户通过类似 SQL 的查询语言(HiveQL)进行数据操作,而无需直接编写复杂的 MapReduce 程序。以下是 Hive 的核心特点和应…...
MAC电脑常用操作
环境:M3芯片 ,macOS15.2 🚀 快捷键 🖥️ 窗口管理 ✅ 退出/进入全屏模式 • 浏览器等应用:⌘ Command Ctrl F ✅ 最小化当前窗口 • ⌘ Command M • 💡 隐藏窗口但保留应用在后台运行 ✅ 关闭当前标…...
leetcode 1287. 有序数组中出现次数超过25%的元素 简单
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。 请你找到并返回这个整数 示例: 输入:arr [1,2,2,6,6,6,6,7,10] 输出:6提示: 1 < arr.length…...
3.8【Q】cv
这个draw_line函数的逻辑和功能是什么?代码思路是什么?怎么写的? 这个t是什么?t.v[0]和t.v[1],[2]又是什么? void rst::rasterizer::draw(rst::pos_buf_id pos_buffer, rst::ind_buf_id ind_buffer, rst::Primitive ty…...
upload-labs文件上传
第一关 上传一个1.jpg的文件,在里面写好一句webshell 保留一个数据包,将其中截获的1.jpg改为1.php后重新发送 可以看到,已经成功上传 第二关 写一个webshell如图,为2.php 第二关在过滤tpye的属性,在上传2.php后使用b…...
PyTorch中Tensor对象的属性和方法
目录 一、核心属性 复数支持 转置与视图操作 元信息 梯度相关 二. 常用方法 基本操作 转置与视图 数学运算 深度学习相关 3. 使用示例 梯度计算 设备管理 自定义反向传播 4. 注意事项 总结 一、核心属性 1.requires_grad: _bool: 该…...
C++20 格式化库:强大的字符串格式化工具
文章目录 格式化语法常见用法1. 填充和对齐2. 数值格式化3. 进制格式化4. 自定义类型 示例代码注意事项 C20 的格式化库是一个强大的工具,用于处理字符串的格式化操作。它提供了类似于 Python 中 str.format() 的功能,但语法和用法更符合 C 的风格。以下…...
[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中
[傻瓜式教学]如何将MathType公式编辑器内嵌到WPS工具栏中 将MathType公式编辑器内嵌到WPS工具栏中 下载好所需文件 我用夸克网盘分享了「mathtype安装教程超简单易上手.zip」,点击链接即可保存。打开「夸克APP」 链接:https://pan.quark.cn/s/4726c684…...
分析TCP三次握手与四次挥手
TCP(传输控制协议)通过三次握手建立连接,四次挥手终止连接,确保数据传输的可靠性。 TCP的三个控制标志位: SYN——用于建立连接,同步序列号。 ACK——用于确认收到的数据。 FIN——用于终止连接。 ISN…...
【深度学习】宠物品种分类Pet Breeds Classifier
文章目录 宠物品种数据集制作宠物品种标签图像预处理Presizing 损失函数loss观察模型的性能提升模型的性能learning rate finder使用CLR算法训练选择学习率的策略重新训练 迁移学习微调fine_tunefit_one_cycle有判别力的学习率 选择epoch的数量更深的网络架构 宠物品种数据集 …...
【从零开始学习计算机科学】HLS算子调度
算子调度 调度是HLS 中的核心问题,为无时序或部分时序的输入指定时钟边界,其对最终结果质量具有很大的影响。调度会影响时钟频率、延时、吞吐率、面积、功耗等多种因素。 调度的输入是控制数据流图,其节点表示算子/操作,有向边表示数据依赖,控制依赖,优先依赖。如果没有…...
centos 安装composer 教程
打开命令行 php -r "copy(https://getcomposer.org/installer, composer-setup.php);" sudo php composer-setup.php --install-dir/usr/local/bin --filenamecomposer composer --version sudo chmod us /usr/local/bin/composer Super18120/article/details/14388…...
C语言_数据结构总结2:动态分配方式的顺序表
0——静态分配内存的顺序表和动态分配内存的顺序表的相同之处和不同之处 相同之处 基本操作逻辑相同:无论是静态分配还是动态分配的顺序表,其核心的操作逻辑是一致的。例如插入操作都需要将插入位置之后的元素依次后移,删除操作都需要将删除…...
嵌入式人工智能应用-第6章 人脸检测
嵌入式人工智能应用 人脸检测 嵌入式人工智能应用1 人脸检测1.1 CNN 介绍1.2 人脸检测原理1.3 MTCNN介绍1.4 NCNN介绍2 系统安装2.1 安装依赖库NCNN2.2 运行对应的库3 总结1 人脸检测 1.1 CNN 介绍 卷积神经网络。卷积是什么意思呢?从数学上说,卷积是一种运算。它是我们学习…...
关于无感方波启动预定位阶段
一、预定位的核心目标与原理 消除启动不确定性 无位置传感器下,转子初始位置未知,直接换相可能导致反转或失步。预定位通过施加固定方向磁场,强制转子对齐至预定角度(通常0或60电角度),建立初始位置基准。 …...
WSL安装及问题
1 概述 Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,开发人员可以在 Windows 计算机上同时访问 Windows 和…...




