数据结构-链式二叉树
文章目录
- 一、链式二叉树
- 1.1 链式二叉树的创建
- 1.2 根、左子树、右子树
- 1.3 二叉树的前中后序遍历
- 1.3.1前(先)序遍历
- 1.3.2中序遍历
- 1.3.3后序遍历
- 1.4 二叉树的节点个数
- 1.5 二叉树的叶子结点个数
- 1.6 第K层节点个数
- 1.7 二叉树的高度
- 1.8 查找指定的值(val)
- 1.9 二叉树的销毁
- 二、层序遍历
- 2.1 二叉树的层序遍历
- 2.2 层序遍历判断二叉树是否是完全二叉树
- 三、二叉树的性质(补充)
- 3.1选择题
一、链式二叉树
因为二叉树的度是确定的,所以可以用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成: 数据域和左右指针域。左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址,其结构如下:
typedef int BTDataType;
//二叉链
typedef struct BinaryTreeNode
{struct BinaryTreeNode* left; //指向当前结点的左孩子struct BinaryTreeNode* right; //指向当前结点的右孩子BTDataType val; //当前结点的值域
}BTNode;
1.1 链式二叉树的创建
二叉树的创建方式比较复杂, 为了更好的步入到二叉树的内容中,我们先手动创建一棵链式二叉树。
比如我们要创建如下一个二叉树:
//创建节点
BTNode* BuyBTNode(int val)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL){perror("malloc fail");return NULL;}newnode->val = val;newnode->left = NULL;newnode->right = NULL;return newnode;
}
//创建链式二叉树
BTNode* CreateBTree()
{BTNode* node1 = BuyBTNode(1);BTNode* node2 = BuyBTNode(2);BTNode* node3 = BuyBTNode(3);BTNode* node4 = BuyBTNode(4);BTNode* node5 = BuyBTNode(5);BTNode* node6 = BuyBTNode(6);BTNode* node7 = BuyBTNode(7);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;node5->left = node7;return node1;
}
1.2 根、左子树、右子树
由于这里是链式二叉树,所以后面我们看到一个二叉树,就要把树分成三个部分:根、左子树、右子树。回顾二叉树的概念:二叉树分为空树和非空二叉树,非空二叉树由根结点、根结点的左子树、根结点的右子树组成的。
根结点的左子树和右子树分别又是由子树的根结点、子树结点的左子树、子树结点的右子树组成的。因此二叉树的定义是递归式的, 后序链式二叉树的操作中基本都是按照该概念实现的。
1.3 二叉树的前中后序遍历
二叉树的操作离不开树的遍历,那二叉树的遍历有哪些方式呢?比如我们要遍历下面这个二叉树:
二叉树的遍历分为三种:前/中/后序遍历。下面我们分别讲解三种遍历。
1.3.1前(先)序遍历
▲ 前序遍历(Preorder Traversal(DLR)亦称先序遍历): 访问根结点的操作发生在遍历其左右子树之前
访问顺序为: 根结点、左子树、右子树
void PreOrder(BTNode* root)
{if (root == NULL){printf("# ");return;}printf("%c ",root->val);PreOrder(root->left);PreOrder(root->right);
}
先看运行结果:
打印的结果为什么是上面的样子呢?这里涉及到函数的递归,所以要先理解前序遍历的顺序是根、左子树、右子树。也就是从根节点开始遍历,根遍历完了就到左子树,那左子树又可以分为根、左子树、右子树,又会按照根左右的顺序遍历;要等到左子树完完全全遍历完了,才会遍历到右子树。这里的难点就是: 理解递归递推的终止条件和每一层函数调用完毕后会返回上一层调用它的函数处继续往后执行(回归)。
前序遍历的递归过程如下:
1.3.2中序遍历
◆中序遍历(lnorder Traversal(LDR)): 访问根结点的操作发生在遍历其左右子树之中(间)
访问顺序为: 左子树、根结点、右子树
void InOrder(BTNode* root)
{if (root == NULL){printf("# ");return;}InOrder(root->left);printf("%c ", root->val);InOrder(root->right);
}
打印结果如下:
中序遍历就是从左子树开始遍历,左子树遍历完了就遍历根,最后再遍历右子树。而其中的子树又可以分为左子树、根、右子树,又会按照左根右的顺序遍历。
1.3.3后序遍历
▼后序遍历(Postorder Traversal(LRD)): 访问根结点的操作发生在遍历其左右子树之后
访问顺序为: 左子树、右子树、根结点
void PostOrder(BTNode* root)
{if (root == NULL){printf("# ");return;}PostOrder(root->left);PostOrder(root->right);printf("%c ", root->val);
}
打印结果如下:
后序遍历就是根要在左右子树之后访问。前\中\后续遍在历代码中的递归调用虽然只是换了个位置,但是递归调用的过程是不相同的,如不理解函数的逐层调用过程,就需要画图层层递进地来深刻剖析递归。
1.4 二叉树的节点个数
通过递归计算二叉树的节点个数:
int BTreeSize(BTNode* root)
{if (root == NULL)return 0;return BTreeSize(root->left) + BTreeSize(root->right) + 1;
}
这里要理解递归的过程是什么样, 以下图的举例来理解这里的递归:
这里递推的结束条件是:子树为空才会回归上一层; 而空树就没有节点嘛!所以return 0。在返回上一层的时候可以看到是左右子树都递归完毕而且还要加一个1之后才返回上一层,加的1其实就是加上根节点的数量。
1.5 二叉树的叶子结点个数
通过递归计算二叉树的叶子节点个数:
int BTreeLeafSize(BTNode* root)
{if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return BTreeLeafSize(root->left) + BTreeLeafSize(root->right);
}
没有孩子节点的节点就是叶子节点,所以递推结束的条件就是:该节点的左右子树为空就返回1,即把该叶子节点的数量计上。而一开始的判空其实针对对根节点而言的。如果树都为空,那就没有叶子节点啦。举例递归过程:
1.6 第K层节点个数
二叉树的第K层节点个数:
int BTreeLevelKSize(BTNode* root, int k)
{assert(k > 0);if (root == NULL)return 0;if (k == 1)return 1;return BTreeLevelKSize(root->left, k - 1)+ BTreeLevelKSize(root->right, k - 1);
}
计算二叉树第K层的节点,这里需要加入一个参数k才能实现,因为我们不知道递归什么时候会到达第k层,所以传一个参数k,让它每递推一次就递减1,若根节点为第一层,则k递减到1就到达第k层了(递推终止条件)。当然还有一个递推终止条件就是还没到达第k层就已经出现了空节点,所以还没到达第k层时就遇到了空就返回。
1.7 二叉树的高度
通过递归计算二叉树的高度/深度:
int BTreeDepth(BTNode* root)
{if (root == NULL)return 0;int leftDepth = BTreeDepth(root->left);int rightDepth = BTreeDepth(root->right);return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
计算二叉树的高度也就是计算该二叉树有多少层?那就是我们要找到一个沿着其祖先路径最长的那个节点。所以左右子树之间需要通过比较返回较长的那个节点才行。每返回一层要加个1因为每个节点相较于其孩子节点都是一个根,只要不为空就要算一节长度。
注意:如果上面的代码简化写成下面的样子:
return BTreeDepth(root->left) > BTreeDepth(root->right)? BTreeDepth(root->left)+1 : BTreeDepth(root->right)+1;
这样写时间效率上会非常差。试想:如果二叉树的节点数量庞大,即层数很多时;左右子树相比较就要进行两个函数的递归调用,递归调用又是三目表达式,那时间消耗就会很大;而等比较出了大小以后,才决定三目表达式的返回值;而返回值又是一个函数的递归调用,递推进入下一层以后还是面临同样的三目表达式,同样的事情一遍又一遍地重复,就会消耗非常非常多的时间。所以这里不建议这么写,最好的方式就是将函数的返回值记录下来,这样回归的时候将记录下来的值返回去,就不会造成上面的情况。
1.8 查找指定的值(val)
在二叉树中查找指定的值x, 如果找到则返回该节点的地址, 否则返回NULL。
BTNode* BTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;BTNode* ret1 = BTreeFind(root->left, x);if (ret1 != NULL)return ret1;return BTreeFind(root->right, x);
}
举如下一个例子:比如我们要找x == 3的节点,则函数的递归过程如下:
递归的难点就是返回值不是一下子返回到最上面(最外面)的函数,而是返回上一层调用它的函数处。
1.9 二叉树的销毁
销毁二叉树的销毁就比较简单了, 递归的过程采用后续遍历释放节点:
void BTreeDestroy(BTNode* root)
{if (root == NULL)return;BTreeDestroy(root->left);BTreeDestroy(root->right);free(root);
}
链式二叉树适合于数据的存储,但并不适用于数据的增删查改。所以这里只是了解链式二叉树的性质,以及怎样通过递归去求二叉树的节点、叶子结点、高度等。
二、层序遍历
2.1 二叉树的层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推;自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
实现层序遍历最好的方法是借助数据结构: 队列
可以看到上图通过队列就可以实现二叉树的层序遍历,每出队一个元素就让该元素的左右孩子入队。代码实现如下:(队列的性质是先进先出)
void LevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root != NULL)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* top = QueueFront(&q);printf("%c ", top->val);QueuePop(&q);if (top->left != NULL){QueuePush(&q, top->left);}if (top->right != NULL){QueuePush(&q, top->right);}}QueueDestroy(&q);
}
注意:这里队列中每个节点存放的值(data)是二叉树节点的地址。所以队列出队只是将队列的头结点释放掉了,而并没有把节点里存放的二叉树节点指针删掉。上面的代码中可以看到已经提前将队头节点的值(二叉树节点的指针)存放在top里面了。
2.2 层序遍历判断二叉树是否是完全二叉树
有了层序遍历这种方法,我们其实就可以用此方法判断一个二叉树是否是完全二叉树:
bool IsCompleteBTree(BTNode* root)
{Queue q;QueueInit(&q);if (root != NULL)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);//遇到有空指针的地方就跳出循环if (front == NULL)break;QueuePush(&q,front->left);QueuePush(&q,front->right);}//只管出队 //在出队的过程中若有不为空的指针说明不是完全二叉树while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front != NULL){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;
}
三、二叉树的性质(补充)
1.若规定根结点所在层数为1, 则一棵非空二叉树的第i层上最多有2i-1个结点.
2.若规定根结点所在层数为1,则深度(层数)为h的二叉树的最大结点数是2h-1
3.对任何一棵二叉树, 如果度为0的叶结点个数为n0, 度为2的分支结点个数为n2, 则有: n0=n2+1
解释一下第三个性质:
3.1选择题
(1) 某完全二叉树按层次输出(同一层从左到右)的列为ABCDEFGH,该完全二叉树的前序序列为 (A)
A ABDHECFG
B ABCDEFGH
C HDBEAFCG
D HDEBFGCA
(2) 某二叉树的先序遍历和中序遍历如下: 先序遍历: EFHIGJK; 中序遍历: HFIEJKG. 则二叉树根节点为 (A)
A E
B F
C G
D H
(3) 一棵二叉树的中序遍历序列为: badce,后序遍历序列为: bdeca,则该二叉树的前序历列为 (D)
A adbce
8 decab
C debac
D abcde
记住:前序序列能确定根节点在最左边,后续遍历能确定根节点在最右边,再结合中序遍历就能分割出整体的左、根、右。将该二叉树画出来。
(4) 某二叉树的后序遍历序列与中序遍历序列相同,均为ABCDEF,则按层次输出(同一层从左到右)为 (A)
A FEDCBA
B CBAFED
C DEFCBA
D ABCDEF
(5) 某二叉树共有399个结点,其中有199个度为2的结点,则该二又树中的叶子结点数为 (B)
A 不存在这样的二叉柯
B 200
C 198
D 199
通过二叉树性质可知:该二叉树的叶子节点个数为199+1 == 200
(6) 下列数据结构中,不适合采用顺序存储结构的是 (AC)
A 非完全二叉树
B 堆
C 队列
D 栈
(7) 在具有2n个结点的完全二叉树中中,叶子结点个数为(A)
A n
B n+1
C n-1
D n/2
(8) 一棵完全二又树的结点个数为531个,那么这棵树的高度为 (B)
A 11
B 10
C 8
D 12
相关文章:
数据结构-链式二叉树
文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…...
C++中接口与继承的区别(自我学习用)
继承(Inheritance)和 接口(Interface)是面向对象编程(OOP)中的两种不同概念,虽然在 C 中没有像 Java 那样的 interface 关键字,但可以通过 纯虚函数 来实现接口的概念。让我们详细比…...
vue2拖拽式页面构建
在Vue 2中构建一个拖拽式页面,你可以使用第三方库如vuedraggable,它是基于Sortable.js的一个Vue组件,非常适合用于实现拖拽功能。 步骤 1: 安装vuedraggable 首先,你需要安装vuedraggable。在你的Vue项目中,运行以下命…...
ASUS/华硕天选3 FA507R FA707R 原厂Win11 21H2家庭版系统 工厂文件 带ASUS Recovery恢复
华硕工厂文件恢复系统 ,安装结束后带隐藏分区,带一键恢复,以及机器所有的驱动和软件。 支持型号:FA507RC, FA507RE, FA507RM, FA507RW, FA707RC, FA707RE, FA707RM, FA707RW, FA507RH, FA707RH, FA507RR, FA707RR 系统版本&…...
部署onlyoffice后,php版的callback及小魔改(logo和关于)
作为这篇博文的补充CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记,现在继续… 本次主要内容有:php中callback的调用、自签证书调用callback遇到SSL certificate problem: unable to get local issuer certificate问题、修改onlyoffic…...
轻松打造专属音乐库:Alger Music本地部署与远程访问全流程解析
文章目录 前言1. 安装Docker2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嗨,大家好!今天我要给大家安利一款超级棒的第三方网抑云音乐播放器。这款神器不仅颜值超高、功能强大,还能让你彻底告别那些烦人的…...
redis集群的分片技术
Redis 集群模式通过 数据分片(Sharding) 技术将数据分布到多个节点上,从而实现横向扩展和高性能。以下是 Redis 集群分片技术的详细介绍: 1. 数据分片的基本原理 Redis 集群将整个数据集划分为 16384 个哈希槽(Hash S…...
OA审批 / 流程管理 :流程设计/审批人设置/选择节点的审批人 | Java获取树形用户列表
文章目录 引言I 树形用户列表VO通用树状节点类型通用树状节点对象II 获取树形用户列表准备部门信息和用户信息III 其他相关表结构组织机构引言 流程设计/审批人设置/选择节点的审批人 树形显示用户列表(安装组织机构层级显示) 接口返回的树形用户的数据结构I 树形用户列表VO …...
【Pandas】pandas Series case_when
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值 pandas.Series.…...
.NET 9.0 的 Blazor Web App 项目,自定义日志 TLog V2 使用备忘
一、TLog V1 使用静态数据库上下文,优点是速度快,缺点是内存占用大,参见 .NET 9.0 的 Blazor Web App 项目、Bootstrap Blazor 组件库、自定义日志 TLog 使用备忘_navigationmanager.tobaserelativepath-CSDN博客 二、 TLog V2 改为 依赖注入…...
数据仓库与数据挖掘记录 二
1.数据仓库的产生 从 20 世纪 80 年代初起直到 90 年代初,联机事务处理一直是关系数据库应用的主流。然而,应用需求在不断地变化,当联机事务处理系统应用到一定阶段时,企业家们便发现单靠拥有联机事务处理系统已经不足以获得市场竞争的优势,他们需要对其自身业务的运作以及整个…...
SolidWorks速成教程P3-1【零件 | 第一节】——特征成型介绍拉伸凸台/基体与设计树
零件是由特征构成的,所以零件学习也叫做特征学习。 特征命令,我们可以认为是将二维草图变成三维实体的过程,学习完成后我们就能画出很多东西了,比如画一台手机的外形,学完后我们一起画一个手机支架,来熟练…...
vscode插件Remote - SSH使用教程
Remote - SSH 是一款非常实用的 Visual Studio Code (VSCode) 扩展插件,它允许开发者通过SSH连接到远程服务器,并像在本地一样进行代码编辑和调试。这意味着你可以直接在VS Code中打开位于远程机器上的文件夹,并利用本地安装的VS Code功能,如语法高亮、智能感知、Git集成等…...
sqli_labs_master Less-8 时间盲注,boolen盲注 获取数据库中的表、列
获取当前数据库名 import requestsdef inject_database(url):namemax_length20 # 假设数据库名称最大长度为20# ASCII范围:数字、字母、下划线(_)low{a: 97, z: 122, A: 65, Z: 90, 0: 48, 9: 57, _: 95}high{97: a, 122: z, 65: A, 90: Z,…...
Android Studio:RxJava事件流Observable
一、什么是“事件流”? 简单来说,事件流 就是数据从一个地方(发布者)传递到另一个地方(订阅者)的过程,像是一个“流水线”。发布者发布事件(数据),订阅者则在…...
Influxdb学习 - TSM存储
InfluxDb为什么这么快 InfluxDB 之所以在时序数据场景下表现出色,主要得益于其专为时序数据优化的架构设计和多层次的性能优化策略 专为时序设计:TSM 引擎、列式存储、时间分区等特性直接针对时序数据痛点。写入优化:内存缓存 + 批量刷盘 + 高压缩率,最大化吞吐。查询加速…...
监控系统磁盘 I/O 性能的命令
iostat -x -k 1 是一个用于监控系统磁盘 I/O 性能的命令,下面详细解释该命令以及其输出各项的含义。 命令参数解释 iostat:这是一个用于报告中央处理器(CPU)统计信息和磁盘输入 / 输出统计信息的工具。 -x:显示扩展的…...
NumPy中生成和堆叠数组、生成切片的特殊对象:np.r_ np.c_ np.s_
在NumPy中有三个特殊的对象,非常好用: np.r_:按行连接两个数组,也就是将两个数组垂直堆叠。np.c_:按列连接两个数组,也就是将两个数组水平堆叠。np.s_:生成用于切片的slice对象。 下面详细介绍…...
js计算当(月/年)工作日(除去节假日)时间进度
js封装文件 // 获取当年的节假日12个月的数据 let holidaysArr [[1, 4, 5, 11, 12, 18, 19, 25, 26, 27, 28, 29, 30, 31], // 1月[1, 2, 3, 4, 5, 6, 9, 15, 16, 22, 23], // 2月[], // 3月[4, 5, 6, 12, 13, 19, 20, 26], // 4月[1, 2, 3, 4, 5, 10, 11, 17, 18, 24, 25, …...
zyNo.22
常见Web漏洞解析 命令执行漏洞 1.Bash与CMD常用命令 (1)Bash 读取文件:最常见的命令cat flag 在 Bash 中,cat 以及的tac、nl、more、head、less、tail、od、pr 均为文件读取相关命令,它们的区别如下: …...
服务器绑定 127.0.0.1 和 0.0.0.0 的区别
前言 IP 地址实际上并不是分配给计算机的,而是分配给网卡的,因此当计算机上存在多块网卡时,每一块网卡都会有自己的 IP 地址。 绑定 127.0.0.1 是绑定到 lookback 这个虚拟的本地回环接口,该接口只处理本机上的数据,…...
系统思考—团队学习
“一个人的成长是从问题中学习,而组织的成长是从结构中进化。” —— 彼得圣吉 看似松散的团队学习结构,回头一看,你早已成长了许多。今天和小伙伴们聊起2024年,才发现很多改变,都是在不经意间发生的。 从最初的探索…...
《Python百炼成仙》21-30章(不定时跟新)
第廿一章 列表开天可变序列初成 不周山的擎天玉柱裂开蛛网纹路,山体内部传出数据结构崩塌的轰鸣。叶军踏着《数据结构真解》残页凌空而立,手中薛香的本命玉尺泛起列表操作的幽光: 补天石序列 [五色石] * 9补天石序列[3] 息壤 # 引发链式变…...
element-ui时间组件同一个月内选择/30天内选择
element-ui时间组件同一个月内选择/30天内选择 同一个月 <el-date-picker v-model"time" type"datetimerange"range-separator"至" start-placeholder"开始时间"value-format"timestamp" :picker-options"pickerO…...
【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解
目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…...
微信小程序配置3 配置sass
1. 在config。json文件里面的setting配置“sass” 2. 改你需要的页面后缀名为scss。 3.查看页面即可看到样式。...
应用层优秀的共享民宿物联网框架该怎么选?
有一说一,应用层优秀的物联网框架通常能帮助提升用户体验、提高运营效率、节能减排等等优势,很多老板也很注重这个层面的设计和打磨,那么对于选择应用层优秀的共享民宿物联网框架时,大家可以从哪几个关键因素进行考量呢࿱…...
macOS 上部署 RAGFlow
在 macOS 上从源码部署 RAGFlow-0.14.1:详细指南 一、引言 RAGFlow 作为一款强大的工具,在人工智能领域应用广泛。本文将详细介绍如何在 macOS 系统上从源码部署 RAGFlow 0.14.1 版本,无论是开发人员进行项目实践,还是技术爱好者…...
postman登录cookie设置
1.设置环境变量, 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…...
如何在Linux中设置定时任务(cron)
在Linux系统中,定时任务是自动执行任务的一种非常方便的方式,常常用于定期备份数据、更新系统或清理日志文件等操作。cron是Linux下最常用的定时任务管理工具,它允许用户根据设定的时间间隔自动执行脚本和命令。在本文中,我们将详…...
激光工控机在精密制造中的应用与优势
在精密制造中,激光工控机可以用于许多场景例如 激光切割与雕刻:用于金属、塑料、陶瓷等材料的精密切割和雕刻,适用于汽车、航空航天、电子等行业;可实现复杂图案和高精度加工,满足微米级精度要求。 激光焊接…...
conda的创建
1. 确认 conda 已安装 在使用 conda 创建环境之前,需要确保 conda 已经成功安装在你的系统中。你可以通过在命令行中输入以下命令来检查: conda --version如果已经安装,命令行会显示 conda 的版本号;若未安装,你可以…...
python视频爬虫
文章目录 爬虫的基本步骤一些工具模拟浏览器并监听文件视频爬取易错点一个代码示例参考 爬虫的基本步骤 1.抓包分析,利用浏览器的开发者工具 2.发送请求 3.获取数据 4.解析数据 5.保存数据 一些工具 requests, 用于发送请求,可以通过get,p…...
cv2.Sobel
1. Sobel 算子简介 Sobel 算子是一种 边缘检测算子,通过对图像做梯度计算,可以突出边缘。 Sobel X 方向卷积核: 用于计算 水平方向(x 方向) 的梯度。 2. 输入图像示例 假设我们有一个 55 的灰度图像,像素…...
Oracle入门精读03_Oracle11g安装目录及子目录的结构简介
在Windows2012 Server R2,个人把 Oracle Database 11g安装于硬盘D,如下: 在Oracle Database 11g中,Oracle的目录结构是由Oracle_Base及其子目录cfgtoollogs 、diag 、product、admin、flash_recovery_area和oradata等。这个与Oracle 10G不同的…...
Unity 卡死排查方法(游戏死循环、打包卡死)
适用场景 游戏运行一半卡住了 打包卡住了 工具 visual studio 方法 visual studio 启动工程,调试->附加到Unity,如果开了多个unity,可以用附加到进程找unity 打开线程窗口,调试->窗口->线程 点击暂停按钮&…...
开源、免费项目管理工具比较:2025最新整理30款
好用的开源、免费版项目管理系统有:1.Redmine;2. Taiga;3. OpenProject; 4.ProjectLibre; 5.GanttProject; 6.Tuleap; 7.Trac;8. Phabricator; 9.Notion; 10.…...
AlmaLinux使用Ansible自动部署k8s集群
以下是使用Ansible在AlmaLinux上自动化部署Kubernetes(K8S)集群的详细步骤: 1. 环境准备 1.1 节点规划 至少3台AlmaLinux 9服务器(1个Master,2个Worker)确保所有节点网络互通,SSH免密登录已配…...
Django创建超管用户
在 Django 中创建超级用户(superuser)可以通过命令行工具 createsuperuser 完成。以下是具体步骤: 1. 确保已进行数据库迁移 在创建超级用户前,确保已执行数据库迁移: python manage.py migrate 2. 创建超级用户 …...
机器翻译技术的演进与未来趋势:从规则到神经网络的革新
随着全球化的不断推进和多语言交流的日益频繁,机器翻译(Machine Translation, MT)技术的需求日益增长。机器翻译技术经历了从基于规则的方法到统计方法,再到如今的神经网络方法的发展历程。本文将探讨机器翻译技术的演进过程及其未来趋势,并结合Python代码示例,展示现代机…...
蓝桥杯备赛 Day13.1走出迷宫
链接:走出迷宫 题目描述 小明现在在玩一个游戏,游戏来到了教学关卡,迷宫是一个N*M的矩阵。 小明的起点在地图中用“S”来表示,终点用“E”来表示,障碍物用“#”来表示,空地用“.”来表示。 障碍物不能通…...
Word中Ctrl+V粘贴报错问题
Word中CtrlV粘贴时显示“文件未找到:MathPage.WLL”的问题 Word的功能栏中有MathType,但无法使用,显示灰色。 解决方法如下: 首先找到MathType安装目录下MathPage.wll文件以及MathType Commands 2016.dotm文件,分别复…...
C# Barrier 类使用详解
总目录 前言 Barrier 是 C# 中用于多线程分阶段协同工作的同步工具,位于 System.Threading 命名空间下。它允许多个线程在指定阶段(Phase)的屏障点(Barrier Point)同步,所有线程到达屏障点后,才…...
DeepSeek应用——与word的配套使用
目录 一、效果展示 二、配置方法 三、使用方法 四、注意事项 1、永久化使用 2、宏被禁用 3、office的生成失败 记录自己学习应用DeepSeek的过程...... 这个是与WPS配套使用的过程,office的与这个类似: 一、效果展示 二、配置方法 1、在最上方的…...
基于AIOHTTP、Websocket和Vue3一步步实现web部署平台,无延迟控制台输出,接近原生SSH连接
背景:笔者是一名Javaer,但是最近因为某些原因迷上了Python和它的Asyncio,至于什么原因?请往下看。在着迷”犯浑“的过程中,也接触到了一些高并发高性能的组件,通过简单的学习和了解,aiohttp这个…...
CentOS 7.8 安装MongoDB 7教程
文章目录 CentOS 7.8 安装MongoDB 7教程一、准备工作1. 系统更新2. 权限 二、添加MongoDB软件源1. 创建MongoDB的yum源文件2. 添加以下内容3. 保存并退出编辑器 三、安装MongoDB1. 更新yum缓存2. 安装MongoDB 四、启动MongoDB服务1. 启动MongoDB2. 设置MongoDB开机自启动 五、配…...
瑞芯微开发板/主板Android调试串口配置为普通串口方法 深圳触觉智能科技分享
本文介绍瑞芯微开发板/主板Android调试串口配置为普通串口方法,不同板型找到对应文件修改,修改的方法相通。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联…...
【HDFS】addInternalPBProtocol、setProtocolEngine和registerProtocolAndImpl
本文主要与Hadoop的RPC框架相关 DFSUtil#addInternalPBProtocol: /*** Add protobuf based protocol to the {@link org.apache.hadoop.ipc.RPC.Server}.* This method is for exclusive use by the hadoop libraries, as its signature* changes with the version of the sha…...
springboot239-springboot在线医疗问答平台(源码+论文+PPT+部署讲解等)
💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm…...
web3是什么,最简单的介绍
Web3是指第三代互联网技术,也被称为分布式互联网。它是在传统互联网(Web2.0)基础上发展出来的一种新技术体系,旨在通过区块链技术来重新定义人们访问和使用网络服务的方式。以下是关于Web3的详细介绍: 一、核心特点 …...