【数据结构】二叉树

在这里插入图片描述

🐇

🔥博客主页: 云曦
📋系列专栏:数据结构

💨吾生也有涯,而知也无涯
💛 感谢大家👍点赞 😋关注📝评论

文章目录

  • 前言
  • 一、树的概念及结构
    • 🌳1.1 树的概念
    • 🌳1.4 树和非树
    • 🌳1.3 树的表示
    • 🌳1.4 树在实际中的运用
  • 二、二叉树的概念及结构
    • 🌳2.1 二叉树的概念
    • 🌳2.2 现实中的二叉树
    • 🌳2.3 特殊的二叉树
    • 🌳2.4 二叉树的性质
    • 🌳2.5 二叉树的存储结构
      • ☘️2.5.1 顺序存储
      • ☘️2.5.2 链式存储
  • 三、二叉树链式结构及实现
    • 🌳3.1 二叉树的遍历
      • ☘️3.1.1 二叉树前序、中序、后序遍历的规则
      • ☘️3.1.2 前序遍历
      • ☘️3.1.3 中序遍历
      • ☘️3.1.4 后序遍历
      • ☘️3.1.5 层序遍历
    • 🌳3.2 二叉树节点个数的统计
      • ☘️3.2.1 节点的个数
      • ☘️3.2.2 叶子节点的个数
    • 🌳3.3 二叉树的创建和销毁
      • ☘️3.3.2二叉树的创建
      • ☘️3.3.2 二叉树的销毁
    • 🌳3.3 二叉树接口测试
  • 四、完整代码
    • 🌳<font color=Red>**4.1 BinaryTree.h**
    • 🌳<font color=Red>**4.2 BinaryTree.c**
    • 🌳<font color=Red>**4.3 test.c**

前言

在上期,讲解完栈和队列的实现后,本期迎来了新的知识,名为"二叉树",希望大家能坚持的学习下去。

一、树的概念及结构

🌳1.1 树的概念

树跟之前所学的顺序表、链表等不相同,树是一种非线性 的数据结构,它由n(n>=0)个有序节点组成一个具有层次关系的集合。把它叫作树是因为它看起来像一颗倒挂的树,也就是根朝上,而叶子朝下

  • 有一个特殊的节点,称作根节点,根节点没有前驱节点。
  • 除根节点外,其余结点被分成M(M>0)个互不相交的集T1T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
  • 因此树是由递归定义
    在这里插入图片描述
  • 树的相关概念:
    在这里插入图片描述
  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
  3. 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点
  4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

🌳1.4 树和非树

注意:树形结构中,子树之间是没有交集的,否则就不是树形结构了。
在这里插入图片描述

🌳1.3 树的表示

孩子兄弟表示法:

typedef int DataType;

typedef struct TreeNode
{
	struct TreeNode* firstchild;//第一个孩子节点
	struct TreeNode* nextbrother;//指向下一个兄弟节点
	DataType data;//节点的数据域
}TNode;

🌳1.4 树在实际中的运用

用于表示文件系统的目录数结构
在这里插入图片描述

二、二叉树的概念及结构

🌳2.1 二叉树的概念

每一颗二叉树是节点的一个有序的集合,该集合的特点是:

  1. 由一个根和左子树、右子树的组成的二叉树。
  2. 该树也有可能为空。

在这里插入图片描述
从上图可以看出:

  1. 二叉树不存在大于2的节点。
  2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
  • 注意:对于任何一颗二叉树都有可能由以下几种复合而成的:
    在这里插入图片描述

🌳2.2 现实中的二叉树

在这里插入图片描述

🌳2.3 特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
    在这里插入图片描述

🌳2.4 二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 个结点.
  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 .
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 , 度为2的分支结点个数为 ,则有 = +1
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= . (ps: 是log以2为底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
  • 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
  • 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  • 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

🌳2.5 二叉树的存储结构

☘️2.5.1 顺序存储

顺序结果存储就是用数组来存储的,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而在使用时只有堆才会用数组来存储,所以本期暂时不讲解顺序存储。

☘️2.5.2 链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们使用的都是二叉链,三叉链会在讲解红黑树时使用。

typedef char BTDataType;
//二叉链
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;//指向当前节点左孩子
	struct BinaryTreeNode* right;//指向当前节点右孩子
	BTDataType data;//当前节点值域
}BTNode;

//三叉链
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* parents;//指向当前节点的双亲
	struct BinaryTreeNode* left;//指向当前节点左孩子
	struct BinaryTreeNode* right;//指向当前节点右孩子
	BTDataType data;//当前节点值域
}BTNode;

三、二叉树链式结构及实现

结构的创建

typedef char BTDataType;

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;//左子树
	struct BinaryTreeNode* right;//右子树
	BTDataType data;//节点的数据域
}BTNode;

🌳3.1 二叉树的遍历

学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次

☘️3.1.1 二叉树前序、中序、后序遍历的规则

  • 前序遍历:先访问根节点,其次是左子树,最后是右子树(根 -> 左子树 -> 右子树)
  • 中序遍历:先访问左子树,其次是根,最后是右子树(左子树 -> 根 -> 右子树)
  • 后序遍历:先访问左子树,其次是右子树,最后是根(左子树 -> 右子树 -> 根)
  • 举例:
    在这里插入图片描述

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为
根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

// 二叉树前序遍历
void PreOrder(BTNode* root);
// 二叉树中序遍历
void InOrder(BTNode* root);
// 二叉树后序遍历
void PostOrder(BTNode* root);

☘️3.1.2 前序遍历

//二叉树前序遍历
void PrevOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//根 -> 左子树 -> 右子树
	printf("%c ", root->data);//打印根
	PrevOrder(root->left);//递归左子树
	PrevOrder(root->right);//递归右子树
}

☘️3.1.3 中序遍历

//二叉树中序遍历
void InOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//左子树 -> 根 -> 右子树
	InOrder(root->left);//递归左子树
	printf("%c ", root->data);//打印根
	InOrder(root->right);//递归右子树
}

☘️3.1.4 后序遍历

void PostOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//左子树 -> 右子树 -> 根
	PostOrder(root->left);//递归左子树
	PostOrder(root->right);//递归右子树
	printf("%c ", root->data);//打印根
}

☘️3.1.5 层序遍历

  • 前序中序后序其实也叫:深度优先遍历
  • 而层序遍历也叫作:广度优先遍历
  • 层序的核心思路就是:上层取出的时候,带下一层进
  • 层序遍历需要用到队列来实现,而在C语言中没有队列的库,那么还要实现一个队列。但其实不需要实现,因为上一起已经实现过了,我们直接将源文件和头文件复制粘贴到实现二叉树的目录下即可。(实现栈和队列的链接)
  • 实现思路:在这里插入图片描述
    注意:引用队列的源文件和头文件后,要在队列的头文件里声明树的结构体,然后将队列结构data的类型改为树的结构体指针类型
    在这里插入图片描述
    且在二叉树的头文件里声明队列的头文件时,要在树的结构体后面声明,因为在编译是头文件是张开向上找结构体的。
    在这里插入图片描述
void LevelOrder(BTNode* root)
{
	//创建及初始化队列
	Que q;
	QueueInit(&q);
	//空树就不需要入队列了
	//不是空树就把根节点入队列
	if (root)
	{
		QueuePush(&q, root);
	}

	while (!QueueEmpty(&q))
	{
		//根节点出队列
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		printf("%c ", front->data);
		//左子树入队列
		if (front->left)
		{
			QueuePush(&q, front->left);
		}
		//右子树入队列
		if (front->right)
		{
			QueuePush(&q, front->right);
		}

	}

	printf("\n");
	QueueDestroy(&q);
}

🌳3.2 二叉树节点个数的统计

☘️3.2.1 节点的个数

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

看递归很绕的时候教大家一个方法,画递归展开图
函数递归展开图

☘️3.2.2 叶子节点的个数

int LeafSize(BTNode* root)
{
	//根为空就返回0
	if (root == NULL)
	{
		return 0;
	}
	//左右子树为空,则返回1
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}

	//递归左子树的叶子个数加递归右子树的叶子个数
	return LeafSize(root->left) + LeafSize(root->right);
}

相当于节点个数功能的思路延伸,根为空返回0,左子树与右子树都为空返回1,最后递归左右子树相加就得到了叶子节点的个数。

🌳3.3 二叉树的创建和销毁

☘️3.3.2二叉树的创建

  • 二叉树的创建思路是:通过前序遍历的数组"ABD##E##C##"构建二叉树
  • 只有前序是不可能构建出二叉树的,但是在数组里用’#'表示NULL,这样构建二叉树就很容易了。
    在这里插入图片描述
BTNode* BinaryTreeCreate(BTDataType* s, int* pi)
{
	//遇到'#',加加pi,然后返回NULL
	if (s[*pi] == '#')
	{
		(*pi)++;
		return NULL;
	}

	//malloc出来新的根节点
	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	root->data = s[*pi];
	(*pi)++;
	//递归构建左子树
	root->left = BinaryTreeCreate(s, pi);
	//递归构建右子树
	root->right = BinaryTreeCreate(s, pi);

	return root;
}

☘️3.3.2 二叉树的销毁

销毁的含义依然是:把空间还给操作系统。
销毁二叉树很简单,用后序遍历的思路,把打印数据改成free(释放)节点即可。

//思路就是:使用后序遍历思路销毁
void TreeDestroy(BTNode* root)
{
	//根为空时,直接返回
	if (root == NULL)
	{
		return;
	}

	TreeDestroy(root->left);//递归左子树
	TreeDestroy(root->right);//递归右子树
	free(root);//释放根节点
	root = NULL;
}

🌳3.3 二叉树接口测试

int main()
{
	//构建树
	char str[] = "ABD##E##C##";
	int i = 0;
	BTNode* root = BinaryTreeCreate(str, &i);

	//测试功能
	PrevOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");

	int ATree = TreeSize(root);
	printf("%d\n", ATree);//5
	int BTree = TreeSize(root->left);
	printf("%d\n", BTree);//3
	
	int ALeaf = LeafSize(root);
	printf("%d\n", ALeaf);//3

	LevelOrder(root);//A B C D E

	TreeDestroy(root);
	return 0;
}

在这里插入图片描述

四、完整代码

🌳4.1 BinaryTree.h

#pragma once

#include<stdio.h>
#include<stdlib.h>

//二叉树
typedef char BTDataType;

typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;//左子树
	struct BinaryTreeNode* right;//右子树
	BTDataType data;//当前节点值域
}BTNode;

#include "Queue.h"

//二叉树前序遍历
void PrevOrder(BTNode* root);
//二叉树中序遍历
void InOrder(BTNode* root);
//二叉树后序遍历
void PostOrder(BTNode* root);
//二叉树的层次
//核心思路:上层取出的时候,带下一层进
void LevelOrder(BTNode* root);
//二叉树节点的个数
int TreeSize(BTNode* root);
//二叉树叶子的个数
int LeafSize(BTNode* root);
//二叉树的销毁
void TreeDestroy(BTNode* root);
//通过前序遍历的数组"ABD##E##C##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* s, int* pi);

🌳4.2 BinaryTree.c

#include "BinaryTree.h"

void PrevOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//根 -> 左子树 -> 右子树
	printf("%c ", root->data);//打印根
	PrevOrder(root->left);//递归左子树
	PrevOrder(root->right);//递归右子树
}

void InOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//左子树 -> 根 -> 右子树
	InOrder(root->left);//递归左子树
	printf("%c ", root->data);//打印根
	InOrder(root->right);//递归右子树
}

void PostOrder(BTNode* root)
{
	//根为空就返回
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	//左子树 -> 右子树 -> 根
	PostOrder(root->left);//递归左子树
	PostOrder(root->right);//递归右子树
	printf("%c ", root->data);//打印根
}

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : 
		TreeSize(root->left) + TreeSize(root->right) + 1;
}

int LeafSize(BTNode* root)
{
	//根为空就返回0
	if (root == NULL)
	{
		return 0;
	}
	//左右子树为空,则返回1
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}

	//递归左子树的叶子个数加递归右子树的叶子个数
	return LeafSize(root->left) + LeafSize(root->right);
}

//核心思路:上层取出的时候,带下一层进
void LevelOrder(BTNode* root)
{
	//创建及初始化队列
	Que q;
	QueueInit(&q);
	//空树就不需要入队列了
	//不是空树就把根节点入队列
	if (root)
	{
		QueuePush(&q, root);
	}

	while (!QueueEmpty(&q))
	{
		//根节点出队列
		BTNode* front = QueueFront(&q);
		QueuePop(&q);
		printf("%c ", front->data);
		//左子树入队列
		if (front->left)
		{
			QueuePush(&q, front->left);
		}
		//右子树入队列
		if (front->right)
		{
			QueuePush(&q, front->right);
		}

	}

	printf("\n");
	QueueDestroy(&q);
}

//思路就是:使用后序遍历思路销毁
void TreeDestroy(BTNode* root)
{
	//根为空时,直接返回
	if (root == NULL)
	{
		return;
	}

	TreeDestroy(root->left);//递归左子树
	TreeDestroy(root->right);//递归右子树
	free(root);//释放根节点
	root = NULL;
}

BTNode* BinaryTreeCreate(BTDataType* s, int* pi)
{
	//遇到'#',加加pi,然后返回NULL
	if (s[*pi] == '#')
	{
		(*pi)++;
		return NULL;
	}

	//malloc出来新的根节点
	BTNode* root = (BTNode*)malloc(sizeof(BTNode));
	if (root == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	root->data = s[*pi];
	(*pi)++;
	//递归构建左子树
	root->left = BinaryTreeCreate(s, pi);
	//递归构建右子树
	root->right = BinaryTreeCreate(s, pi);

	return root;
}

🌳4.3 test.c

#include "BinaryTree.h"

int main()
{
	//构建树
	char str[] = "ABD##E##C##";
	int i = 0;
	BTNode* root = BinaryTreeCreate(str, &i);

	//测试功能
	PrevOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");

	int ATree = TreeSize(root);
	printf("%d\n", ATree);//5
	int BTree = TreeSize(root->left);
	printf("%d\n", BTree);//3

	int ALeaf = LeafSize(root);
	printf("%d\n", ALeaf);//3

	LevelOrder(root);

	TreeDestroy(root);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记之vue】 Cannot find module ‘node-sass‘

Cannot find module node-sass方案一&#xff08;不通&#xff09; 下载node-sass组件 >> npm install -g cnpm>>cnpm install node-sass下载时报错 方案二 使用npm下载node-sass组件 >>npm install node-sassok

科技资讯|苹果Vision Pro新专利曝光:可调节液态透镜

苹果公司近日申请了名为“带液态镜头的电子设备”&#xff0c;概述了未来可能的头显设计。头显设备中的透镜采用可调节的液态透镜&#xff0c;每个透镜可以具有填充有液体的透镜腔&#xff0c;透镜室可以具有形成光学透镜表面的刚性和 / 或柔性壁。 包括苹果自家的 Vision Pr…

opencv-目标追踪

import argparse import time import cv2 import numpy as np# 配置参数 ap argparse.ArgumentParser() ap.add_argument("-v", "--video", typestr,help"path to input video file") ap.add_argument("-t", "--tracker", …

JSP-学习笔记

文章目录 1.JSP介绍2 JSP快速入门3 JSP 脚本3.1 JSP脚本案例3.2 JSP缺点 4 EL表达式4.1 快速入门案例 5. JSTL标签6. MVC模式和三层架构6.1 MVC6.2 三层架构 7. 案例-基于MVC和三层架构实现商品表的增删改查 1.JSP介绍 概念 JSP&#xff08;JavaServer Pages&#xff09;是一种…

财报解读:上半年业绩实现增长,药师帮业务飞轮已经开始旋转?

今年6月底登陆港股的药师帮&#xff0c;近日发布了上市后的首份财务报告。 财报显示&#xff0c;2023年上半年&#xff0c;药师帮实现营收增长、经调整后净利润转正的成果&#xff0c;再次验证了二级市场对于其发展潜力的看好——6月底上市以来&#xff0c;药师帮股价涨幅接近…

Redis——set类型详解

概要 Set&#xff08;集合&#xff09;&#xff0c;将一些有关联的数据放到一起&#xff0c;集合中的元素是无序的&#xff0c;并且集合中的元素是不能重复的 之前介绍的list就是有序的&#xff0c;对于列表来说[1, 2, 3] 和 [2, 1, 3]是两个不同的列表&#xff0c;而对于集合…

mybatis详解

mybatis&#xff1a;原来是apache的一个开源项目&#xff0c;叫ibatis。2010年转移谷歌&#xff0c;从3.0开始改名为mybatis mybatis是一款优秀的持久层框架&#xff0c;是对jdbc功能进行轻量级的封装&#xff0c;提供了统一的数据库信息配置统一放在一个xml文件中&#xff0c;…

C++初阶语法——static类成员

前言&#xff1a;本文将介绍类和对象中的static类成员——静态成员函数&#xff0c;静态成员变量的使用方法和注意点。在某些场景下&#xff0c;静态成员很有意义。 目录 一.概念二.特性静态成员不存在对象中 三.静态成员变量在类外初始化四.静态成员函数 一.概念 声明为stati…

记录一次arcgis engine开发版本引入问题

之前基于arcigs 10.1vs2013开发的程序&#xff0c;现在拿出来要改&#xff0c;但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本&#xff0c;都报错 &#xff08;具体版本对应可以看这&#xff1a;ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的UNet-2D案例实现

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年&#xff0c;随着基于自注意&…

WinCC V7.5 中的C脚本对话框不可见,将编辑窗口移动到可见区域的具体方法

WinCC V7.5 中的C脚本对话框不可见&#xff0c;将编辑窗口移动到可见区域的具体方法 由于 Windows 系统更新或使用不同的显示器&#xff0c;在配置C动作时&#xff0c;有可能会出现C脚本编辑窗口被移动到不可见区域的现象。 由于该窗口无法被关闭&#xff0c;故无法进行进一步…

机器学习算法之-逻辑回归(1)

什么是回归 回归树&#xff0c;随机森林的回归&#xff0c;无一例外他们都是区别于分类算法们&#xff0c;用来处理和预测连续型标签的算法。然而逻辑回归&#xff0c;是一种名为“回归”的线性分类器&#xff0c;其本质是由线性回归变化而来的&#xff0c;一种广泛使用于分类问…

【傅里叶级数与傅里叶变换】数学推导——3、[Part4:傅里叶级数的复数形式] + [Part5:从傅里叶级数推导傅里叶变换] + 总结

文章内容来自DR_CAN关于傅里叶变换的视频&#xff0c;本篇文章提供了一些基础知识点&#xff0c;比如三角函数常用的导数、三角函数换算公式等。 文章全部链接&#xff1a; 基础知识点 Part1&#xff1a;三角函数系的正交性 Part2&#xff1a;T2π的周期函数的傅里叶级数展开 P…

SOLIDWORKS 2023中装配体配合的正确使用方法 硕迪科技

-SOLIDWORKS 装配体打开时是由不同的阶段和性能检查组成的。如果在创建装配体时未应用基本的配合方法&#xff0c;问题会随着时间的推移而累积&#xff0c;并且在使用时会出现明显的速度减慢。 如果您的装配体运行速度很慢&#xff0c;则很可能是在创建配合时出现了不良操作的症…

Nacos和GateWay路由转发NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find

问题再现&#xff1a; 2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.java:147] - [dc73b32c-1] Encoding [{timestampTue Aug 15 16:51:16 CST 2023, path/content/course/list, status503, errorService Unavai (truncated)...] 2023-08-15 16:51:16,17…

Vue的鼠标键盘事件

Vue的鼠标键盘事件 原生 鼠标事件(将v-on简写为) click // 点击 dblclick // 双击 mousedown // 按下 mousemove // 移动 mouseleave // 离开 mouseout // 移出 mouseenter // 进入 mouseover // 鼠标悬浮mousedown.left 键盘事件 keydown //键盘按下时触发 keypress …

SpringBoot3集成ElasticSearch

标签&#xff1a;ElasticSearch8.Kibana8&#xff1b; 一、简介 Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎&#xff0c;适用于各种数据类型&#xff0c;数字、文本、地理位置、结构化数据、非结构化数据&#xff1b; 在实际的工作中&#xff0c;历经过Ela…

Azure存储账户

存储账户的概念 Azure存储账户是Azure提供的一种云存储解决方案&#xff0c;用于存储和访问各种类型的数据&#xff0c;包括文件、磁盘、队列、表格和Blob&#xff08;二进制大对象&#xff09;数据。存储账户可以基于访问模式和冗余需求来选择不同的类型&#xff0c;以满足应…

【【Verilog典型电路设计之FIFO设计】】

典型电路设计之FIFO设计 FIFO (First In First Out&#xff09;是一种先进先出的数据缓存器&#xff0c;通常用于接口电路的数据缓存。与普通存储器的区别是没有外部读写地址线&#xff0c;可以使用两个时钟分别进行写和读操作。FIFO只能顺序写入数据和顺序读出数据&#xff0…

Python “贪吃蛇”游戏,在不断改进中学习pygame编程

目录 前言 改进过程一 增加提示信息 原版帮助摘要 pygame.draw pygame.font class Rect class Surface 改进过程二 增加显示得分 改进过程三 增加背景景乐 增加提示音效 音乐切换 静音切换 mixer.music.play 注意事项 原版帮助摘要 pygame.mixer pygame.mix…