树--二叉树(C语言纯手凹)
目录
目录
1.什么是树?(不深入,仅做了解)
2.树的表示方式
2.1孩子兄弟表示法(左孩子右兄弟)
2.2孩子表示法
2.3双亲表示法
3.什么是二叉树
4.二叉树分类
4.1满二叉树
4.2完全二叉树
4.3二叉搜索树(二叉查找树、二叉排序树)
4.4平衡二叉搜索树(AVL树)
5.二叉树的存储结构
6.二叉树性质
6.1若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点
6.2 若规定根节点的层数为1,则深度为h的二叉树的最大结点数(满二叉)是2^h- 1(等比数列求和)
6.3对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2 +1
(公式记住就好)
6.4 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h = Log 2 (N + 1)(由2取对数可推)
7.二叉树性质相关选择题
7.1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( B )
7.2.在具有 2n 个结点的完全二叉树中,叶子结点个数为(A )
7.3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( B )
8.二叉树链式结构的遍历
8.1深度优先遍历
8.2广度优先遍历
9.实现
9.1前序遍历的实现
9.2中序遍历的实现
9.3后序遍历的实现
9.4前中后序遍历有关的选择题
9.5层序遍历(广度优先遍历)的实现
10.有关二叉树的OJ题目
10.1 144. 二叉树的前序遍历 - 力扣(LeetCode)
10.2 94. 二叉树的中序遍历 - 力扣(LeetCode)
10.3 145. 二叉树的后序遍历 - 力扣(LeetCode)
10.4 104. 二叉树的最大深度 - 力扣(LeetCode)
10.5110. 平衡二叉树 - 力扣(LeetCode)
10.6清华大学OJ-二叉树遍历
1.什么是树?(不深入,仅做了解)
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。 有一个特殊的结点,称为根结点,根节点没有前驱结点,除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继 因此,树是递归定义的。

A为根节点,#为NULL,D、E为叶节点。
判断下面的是不是树?

注意这个是非树,需要知道树的性质:
1.每个节点(除根节点外)有且只有一个父节点
2.子树之间不相连
3.一颗n节点的树有n-1条边
4.0节点为空树


节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B 的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节 点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;(也有根为第0层的说法)
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
森林:由m(m>0)棵互不相交的多颗树的集合称为森林。
2.树的表示方式
2.1孩子兄弟表示法(左孩子右兄弟)
typedef int DataType;
struct Node
{struct Node* _firstChild1; // 第一个孩子节点struct Node* _pNextBrother; // 指向其下一个兄弟节点DataType _data; // 节点数据域
};

2.2孩子表示法
typedef int DataType;
struct Node
{struct Node* _Child1; // 第1个孩子节点struct Node* _Child2; // 第2个孩子节点struct Node* _Child3; // 第3个孩子节点struct Node* _Child4; // 第4个孩子节点//...(可能有很多个孩子节点)
};
有很多孩子节点就不适用了,一般用于二叉树。
2.3双亲表示法
typedef int DataType;
#define MAXX 100
//树的节点
typedef struct ParentTreeNode
{DataType data;int parent;
}PTNode;
//树的定义
typedef struct ParentTree
{PTNode arr[MAXX];//数组结构int num;//节点数
}PTree;

3.什么是二叉树
二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
特点:
1. 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
2. 二叉树的子树有左右之分,其子树的次序不能颠倒。

4.二叉树分类
4.1满二叉树
一个二叉树,如果每一个层的结点数都达到最大值(2个),则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1(计算等会讲) ,则它就是满二叉树。

4.2完全二叉树
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。除了底层节点可能没填满,其他层每个节点的度都为二叉树最大(2个),并且底层的节点都集中在底层靠左边若干位置(不靠左就不是),若底层为第h层,则最后一层可能有1~2^(h-1)个节点。满二叉树是一种特殊的完全二叉树。


4.3二叉搜索树(二叉查找树、二叉排序树)
二叉搜索树是有数值的,是一个有序树,每个节点满足下列规则:
1.若它的左子树不为空,则左子树上所有节点的值都小于它的根节点的值;(别理解错了,好好理解一下)
2.若它的右子树不为空,则右子树上所有节点的值都大于它的根节点的值;
3.它的左右子树都为二叉搜索树;
总结:左小右大。

4.4平衡二叉搜索树(AVL树)
平衡二叉树又名为AVL树,它可以是空树,或者它的左右两个子树的高度(深度)差的绝对值(abs函数)不超过1,并且左右两个子树都是一颗平衡二叉树。


5.二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序存储(数组),一种链式存储(指针)
一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,所以一般使用链式存储的方式。
链式存储:

顺序存储(按照树的层次遍历顺序来存储节点)(一般用于堆排序):

leftchild = parent*2 + 1;
rightchild = parent*2 + 2;
parent = (child-1) / 2 (忽略小数点).
6.二叉树性质
6.1若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点

6.2 若规定根节点的层数为1,则深度为h的二叉树的最大结点数(满二叉)是2^h- 1(等比数列求和)

6.3对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2 +1
(公式记住就好)
6.4 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h = Log 2 (N + 1)(由2取对数可推)
7.二叉树性质相关选择题
7.1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( B )
A 不存在这样的二叉树 B 200 C 198 D 199
解析:性质6.3秒了
7.2.在具有 2n 个结点的完全二叉树中,叶子结点个数为(A )
A n B n+1 C n-1 D n/2
解析:
7.3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( B )
A 11 B 10 C 8 D 12
解析:由题意知道是完全二叉树,估算一下2^9 - 1== 512(满二叉树9层节点数),那么531就要排到10层了,所以B。
8.二叉树链式结构的遍历
二叉树主要有两种遍历方式:深度优先遍历,广度优先遍历。
8.1深度优先遍历
先往深度遍历,遇到子节点时再往回遍历,深度优先遍历又分为 前序遍历(NLR)、中序遍历(LNR)、后序遍历(LRN),N-根,L-根的左子树,R-根的右子树,根节点是必定访问的,所以顺序是根据根节点的访问顺序命名的。


8.2广度优先遍历
设二叉树的 根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问 树的结点的过程就是层序遍历。

9.实现
9.1前序遍历的实现
#include<stdio.h>typedef int DataType;
//树节点
typedef struct TreeNode
{DataType data;//数据域struct TreeNode* left;//左子树struct TreeNode* right;//右子树
}TN;//构建树
void CreatTree(TN* tree, TN* lefttree, TN* righttree,DataType x)
{tree->data = x;tree->left = lefttree;//连接左树tree->right = righttree;//连接右树
}//前序遍历//递归实现
void PrefaceTraversal(TN* tree)
{if (tree == NULL)//临界条件--叶子节点{printf("NULL ");return;}printf("%d ", tree->data);//访问根节点PrefaceTraversal(tree->left);//访问左子树PrefaceTraversal(tree->right);//访问右子树
}int main()
{//搭建一颗树TN tree1,tree2,tree3,tree4,tree5,tree6,tree7;CreatTree(&tree1, &tree2, &tree3, 1);CreatTree(&tree2, &tree4, &tree5, 2);CreatTree(&tree3, &tree6, &tree7, 3);CreatTree(&tree4, NULL, NULL, 4);CreatTree(&tree5, NULL, NULL, 5);CreatTree(&tree6, NULL, NULL, 6);CreatTree(&tree7, NULL, NULL, 7);PrefaceTraversal(&tree1);//访问return 0;
}


9.2中序遍历的实现
//中序遍历//递归实现
void MidTraversal(TN* tree)
{if (tree == NULL)//临界条件--叶子节点{printf("NULL ");return;}MidTraversal(tree->left);//访问左子树printf("%d ", tree->data);//访问根节点MidTraversal(tree->right);//访问右子树
}


9.3后序遍历的实现
//后序遍历//递归实现
void PosTraversal(TN* tree)
{if (tree == NULL)//临界条件--叶子节点{printf("NULL ");return;}PosTraversal(tree->left);//访问左子树PosTraversal(tree->right);//访问右子树printf("%d ", tree->data);//访问根节点
}

9.4前中后序遍历有关的选择题
解析:前序和后序可以确定根节点(包括子树的根节点),中序可以根据前面分开的根节点确定左子树和右子树。


9.5层序遍历(广度优先遍历)的实现
实现原理:使用队列,先进先出;
核心思想:上一层带下一层;

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int DataType;
typedef struct TreeNode* QDataType;
//树节点
typedef struct TreeNode
{DataType data;//数据域struct TreeNode* left;//左子树struct TreeNode* right;//右子树
}TN;//构建树
void CreatTree(TN* tree, TN* lefttree, TN* righttree, DataType x)
{tree->data = x;tree->left = lefttree;//连接左树tree->right = righttree;//连接右树
}//队列节点
typedef struct QueueNode
{//指向下一个struct QueueNode* next;//数据域QDataType data;//这里数据是树的结构体指针
}QN;//队列
typedef struct Queue
{//记录头节点QN* head;//记录尾节点QN* tail;
}Queue;//初始化队列
void QueueInit(Queue* q)
{assert(q);q->head = q->tail = NULL;
}//入队列--尾插
void QueuePush(Queue* q, QDataType tree)
{assert(q);QN* newnode = (QN*)malloc(sizeof(QN));if (newnode == NULL)//开辟失败{perror("malloc fail");exit(-1);}//队列为空if (q->head == NULL){q->head = q->tail = newnode;newnode->data = tree;newnode->next = NULL;}//队列不为空else{q->tail->next = newnode;newnode->data = tree;newnode->next = NULL;q->tail = newnode;}
}//出队列--头删
void QueuePop(Queue* q)
{assert(q);//队列为空不能删assert(q->head);//只有一个节点的情况if (q->head->next == NULL){free(q->head);q->head = q->tail = NULL;return;}//队列多个节点QN* temp = q->head->next;free(q->head);q->head = temp;
}//判断队列是否为空
bool QueueEmpty(Queue* q)
{assert(q);//空为真return q->head == NULL;
}//访问队头
QDataType QueueFront(Queue* q)
{assert(q);//空不能访问assert(q->head);return q->head->data;
}//销毁
void QueueDestroy(Queue* q)
{assert(q);QN* pcur = q->head;//循环遍历while (pcur){QN* temp = pcur->next;free(pcur);pcur = temp;}//置空q->head = q->tail = NULL;
}//层序遍历
void LevelTraversal(TN* tree)
{Queue q;QueueInit(&q);if (tree){QueuePush(&q, tree);}while (!QueueEmpty(&q)){TN* front = QueueFront(&q);QueuePop(&q);printf("%d ", front->data);if (front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q, front->right);}}printf("\n");QueueDestroy(&q);
}int main()
{//搭建一颗树TN tree1, tree2, tree3, tree4, tree5, tree6, tree7;CreatTree(&tree1, &tree2, &tree3, 1);CreatTree(&tree2, &tree4, &tree5, 2);CreatTree(&tree3, &tree6, &tree7, 3);CreatTree(&tree4, NULL, NULL, 4);CreatTree(&tree5, NULL, NULL, 5);CreatTree(&tree6, NULL, NULL, 6);CreatTree(&tree7, NULL, NULL, 7);LevelTraversal(&tree1);//访问return 0;
}

10.有关二叉树的OJ题目
10.1 144. 二叉树的前序遍历 - 力扣(LeetCode)


/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
//统计节点个数
int TreeSize(struct TreeNode* root){return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}//前序遍历
void prevorder(struct TreeNode* root,int* a, int* pi)
{if(root == NULL)return;a[*pi] = (root->val);(*pi)++;prevorder(root->left,a,pi);prevorder(root->right,a,pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {//创建数组int size = TreeSize(root);int* arr = (int*)malloc(sizeof(int) * size);int i = 0;prevorder(root,arr,&i);*returnSize = size;return arr;
}
10.2 94. 二叉树的中序遍历 - 力扣(LeetCode)
10.3 145. 二叉树的后序遍历 - 力扣(LeetCode)
上面两道做法跟10.1一样
10.4 104. 二叉树的最大深度 - 力扣(LeetCode)


/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
int maxDepth(struct TreeNode* root) {if(root == NULL){return 0;}int left = maxDepth(root->left);int right = maxDepth(root->right);return left > right ? left + 1 : right + 1;
}
10.5110. 平衡二叉树 - 力扣(LeetCode)


/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
//深度
int MaxDepth(struct TreeNode* root)
{if(root == NULL)return 0;int left = MaxDepth(root->left);int right = MaxDepth(root->right);return left > right ? left + 1 : right + 1;
}bool isBalanced(struct TreeNode* root) {if(root == NULL)return true;int left = MaxDepth(root->left);int right = MaxDepth(root->right);if(abs(left - right) < 2 && isBalanced(root->left) && isBalanced(root->right))//要判断子树本身是否是平衡二叉树return true;elsereturn false;
}
10.6清华大学OJ-二叉树遍历
二叉树遍历__牛客网 (nowcoder.com)

先创建树(分治思想递归构建),再中序遍历。
#include <stdio.h>
#include <stdlib.h>
#define MAXX 100typedef struct TreeNode
{struct TreeNode* left;struct TreeNode* right;char val;
}TN;TN* CreatTree(char* s, int* pi)
{if (s[*pi] == '#'){(*pi)++;return NULL;}TN* root = (TN*)malloc(sizeof(TN));if (root == NULL){perror("malloc fail");exit(-1);}root->val = s[*pi];(*pi)++;root->left = CreatTree(s, pi);root->right = CreatTree(s, pi);return root;
}void Inorder(TN* root)
{if (root == NULL){return;}Inorder(root->left);printf("%c ", root->val);Inorder(root->right);
}int main()
{char s[MAXX];scanf("%s", s);int i = 0;TN* root = CreatTree(s, &i);Inorder(root);return 0;
}
相关文章:
树--二叉树(C语言纯手凹)
目录 目录 1.什么是树?(不深入,仅做了解) 2.树的表示方式 2.1孩子兄弟表示法(左孩子右兄弟) 2.2孩子表示法 2.3双亲表示法 3.什么是二叉树 4.二叉树分类 4.1满二叉树 4.2完全二叉树 4.3二叉搜索树…...
TypeScript(七) 函数
1. TypeScript 函数 1.1. 函数的定义 函数就是包裹在花括号中的代码块,前面使用关键字function。 语法: // An highlighted block function function_name() {// 执行代码 }实例: function test() { // 函数定义console.log("我就是…...
学fpga和还是嵌入式?
具体要选哪个,更多还是看个人喜好还有基础知识结构。 我们先来明白下两者区别在哪? 1、嵌入式:分两部分,第一是嵌入式软件开发,主要与嵌入式操作系统、应用软件等有关。第二是嵌入式硬件开发,需要掌握硬件…...
Day01-变量和数据类型课后练习-参考答案
文章目录 1、输出你最想说的一句话!2、定义所有基本数据类型的变量和字符串变量3、用合适类型的变量存储个人信息并输出4、定义圆周率PI5、简答题 1、输出你最想说的一句话! 编写步骤: 定义类 Homework1,例如:Homewo…...
Docker 数据管理、容器互联、网络与资源控制
一、docker数据管理 管理 Docker 容器中数据主要有两种方式:数据卷(Data volumes)和数据卷容器(Datavolumes containers)。 1、数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立…...
密码加密——MD5与BCryptPasswordEncoder
目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密(推荐) 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的,安全性太低 需求: 将密码加密后存储,提高安全性 二、密码加密…...
利用外卖系统源码构建高效的在线订餐平台
在当今数字化时代,外卖服务已成为人们日常生活中不可或缺的一部分。为了满足用户需求,许多创业者和企业都希望搭建自己的在线订餐平台。利用现有的外卖系统源码,可以快速构建一个高效、安全的在线订餐平台。本文将介绍如何利用外卖系统源码来…...
数据分析数据 -(用数据讲故事)
书中有一句话我很喜欢- 献给大家 一个完美的设计,不是因为它没有多余的东西可以添加,而是它没有多余的部分可以删减 首先看几个对比的图形分析 处理工单和新增工单的随月份的变化趋势 这个图形的缺点就是 1: 月份对齐的情况 2:使用条形图需…...
如何运用5W2H分析法分析自己适合哪种办公室
随着时代的发展,办公室已经不再是传统的四壁之内,而是多种多样的形态,涵盖了开放式办公区、远程办公、共享办公空间等多种选择。对于刚刚创业的企业来说,选择一个适合自己发展的办公室至关重要。在这个过程中,运用5W2H…...
为什么考虑电子采购而非传统采购?
采购是重要的业务职能之一,为实现无缝运营而大规模采购商品或服务的行为。考虑到数字化转型带来的影响,决策者对于应维持传统采购还是转向电子采购或多或少会有困惑。 通过本文,你将更了解电子采购和传统采购,从而为业务连续性采…...
【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)
文章目录 原因分析:添加忽略文件(取消跟踪)的命令:取消忽略文件(恢复跟踪)的命令:查看已经添加了忽略文件(取消跟踪)的命令: 原因分析: 已经维护的项目,文件已经被追踪,gitignore文件不方便修…...
科普类——无压缩图像传输带宽的计算(七)
无压缩图像传输带宽的计算 问题计算 问题 要计算1080p(1920x1080)分辨率的彩色图像在30帧每秒(fps)下的带宽需求,我们需要考虑图像的颜色深度(位深)和压缩情况。假设我们使用的是无压缩的RGB图…...
云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29
开源项目推荐 Skaffold Skaffold 是一个命令行工具,有助于 Kubernetes 应用程序的持续开发。您可以在本地迭代应用程序源代码,然后部署到本地或远程 Kubernetes 集群。Skaffold 处理构建、推送和部署应用程序的工作流程。它还提供构建块并描述 CI/CD 流…...
手机壳也能散热了?
作为一个玩了6年的王者荣耀玩家,手机发热真的很影响游戏体验!!游戏掉帧,性能下降很恼人,试过好几个散热工具,实际效果都不太好~ 自从入了Mate 60之后,看着这款微泵液冷壳毫无犹豫第…...
《微信小程序开发从入门到实战》学习九十七
7.3 表单组件 7.3.1 picke-view与picker-view-column组件 一个picker-view-column代表 一个滚动选择器子项,一个picker-view组件可以包含多个picker-view-column组件,这样可以一次性选择多项内容如年、月、日等。 picker-view-column组件中需包含多个…...
二极管漏电流对单片机ad采样偏差的影响
1,下图是常规的单片机采集电压电路,被测量电压经过电阻分压,给到mcu采集,反向二极管起到钳位作用,避免高压打坏mcu。 2,该电路存在的问题 二极管存在漏电流,会在100k电阻上产生叠加电压&#x…...
三、防御保护---防火墙安全策略篇
三、防御保护---防火墙安全策略篇 一、什么是安全策略二、安全策略的组成1.匹配条件2.动作3.策略标识 三、防火墙的状态检测和会话表1.会话表2.状态检测技术 四、ASPF--隐形通道五、用户认证1.用户认证的分类2.认证方式3.认证策略4.认证域 一、什么是安全策略 传统的包过滤防火…...
【学网攻】 第(15)节 -- 标准ACL访问控制列表
系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…...
【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解
【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解 提示:最近开始在【医学图像分割】方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法。 文章目录 【图像分割】【深度学习】Windows10下UNet代码Pytorch实现与源码讲解前言UNet模型运行环境搭…...
MySQL十部曲之一:MySQL概述及手册说明
文章目录 数据库、数据库管理系统以及SQL之间的关系关系型数据库与非关系型数据库MySQL程序系统变量系统状态变量SQL模式MySQL数据目录手册语法约定 数据库、数据库管理系统以及SQL之间的关系 名称说明数据库(Database)即存储数据的仓库,其本…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
