自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (7)
  • 收藏
  • 关注

原创 初学MyBatis:搭建MyBatis框架

本文是作者在自学MyBatis后的自我总结和复习,如有错误请联系作者,不胜感激

2023-04-21 14:28:20 146

原创 Mac下载配置Maven,以及在IDEA 2021.1.3中配置Maven

要知道自己的maven文件夹的具体的位置:/Users/Muran/WorkStation/apache-maven-3.6.3。在IDEA中 -> Preferences -> Build,Execution,Deployment -> Maven。Maven的不同版本对IDEA版本有依赖,本机使用IDEA 2021.1.3 ,使用的是maven3.6.3。然后按esc,输入“ :”,在输入wq进行保存退出。显示Maven的版本信息则配置成功。【本机】:包括了jdk的环境配置。

2023-04-17 18:48:05 431

原创 初学MyBatis的疑问:1、为什么JDBC默认自动提交事务,MyBatis中却需要自己手动提交事务

如果使用MyBatis默认的事务管理方式(即openSession()方法获取的SqlSession对象),该SqlSession对象是默认不会自动提交事务的,也就是需要手动调用commit()方法来提交事务,或调用rollback()方法来回滚事务。这样可以保证所有SQL语句都成功执行才进行事务的提交,否则会进行回滚操作,保证数据的一致性。虽然在JDBC中默认是开启自动提交事务的,但是在实际应用中,很多情况下需要将多个操作组合成一个原子性的操作,这就需要使用事务来保证数据的一致性。

2023-04-17 18:36:52 2365

原创 5.15 哈夫曼树

一、带权路径长度【定义】结点的权:有某种现实含义的数值(如:表示结点的重要性等)结点的带权路径的长度(WPL):从树的根到该结点的路径长度(经过的边数)与该结点上**权值**的乘积树的带权路径长度:树中所有叶子结点的带权路径长度之和(WPL,Weighted Path Length)WPL=∑i=1nwiliWPL=\sum\limits_{i=1}^{n}{w_il_i}WPL=i=1∑n​wi​li​二、哈夫曼树的定义(哈夫曼树 也称 最优二叉树)【定义】在含有n个带权叶结点的二叉树中

2021-08-06 23:03:58 384

原创 5.14 平衡二叉树

一、定义平衡二叉树,简称:平衡树(AVL树)——树上任一结点的左子树和右子树的高度之差不超过1结点的平衡因子 = 左子树高 - 右子树高【注】平衡二叉树结点的平衡因子的值只可能是-1、0、1//平衡二叉树的结点typedef struct AVLNode{ int key; //数据域 int balance; //平衡因子 struct AVLNode *lchild,rchild;}AVLNode,*AVLTree;二、插入操作从插入点往回找到第一个不平衡结点

2021-08-06 23:03:13 268 1

原创 5.13 二叉排序树

一、二叉排序树的定义(BST,Binary Search Tree)【定义】​ 一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树:①左子树上所有结点的关键字均小于根结点的关键字;​ ②右子树上所有结点的关键字均大于根结点的关键字;​ ③左子树和右子树又各是一棵二叉排序树​ 【即】左子树结点值 < 根结点值 < 右子树结点值二、查找操作【思路】​ 若树非空,目标值

2021-08-06 23:02:35 248

原创 5.12 树和森林的遍历

一、树的遍历1.先根遍历(根左右)——深度优先遍历​ 若树非空,先访问根节点,再依次对每棵子树进行先根遍历//树的先根遍历void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); //访问根结点 while(R还有下一棵子树T) PreOrder(T); //先根遍历下一棵子树 }}​ 【注意】树的**先根遍历序列 与 这棵树相应二叉树的先序序列**相同2.后根遍历(左右根

2021-08-06 23:01:56 285

原创 5.11 树的存储结构

一、树的逻辑结构回顾树是一种“递归定义”的数据结构二、双亲表示法:每个结点中保存指向双亲的“指针”#define MAX_TREE_SIZE 100 //树中最多结点数typedef struct{ //树的结点定义 ElemType data; //数据元素 int parent; //双亲位置域}PTNode;typedef struct{ //树的类型定义 PTNode nodes[MAX_TREE_SIZE];//双亲表示

2021-08-06 23:01:09 129

原创 5.10 线索二叉树找前驱/后继

线索二叉树找前驱/后继一、中序线索二叉树1.【问】如何找到一个指定结点的中序后继,即找到指定结点*p的 中序后继 next​ ①若p->rtag==1,则 next = p->rchild​ ②若p->rtag==0,p必有右孩子​ 中序遍历----左 根 右​ 左 根 (左 根 右)​ 左 根 ((左 根 右) 根 右)​ next = p 的右子树中最左下结点【代码实现:中序线索二叉树找"中序后继"】

2021-08-06 23:00:09 1894 2

原创 5.9 二叉树线索化

//一些辅助的全局变量,用于查找结点p的前驱BiTNode *p; //p指向目标结点BiTNode *pre = NULL; //指向当前访问结点的前驱BiTNode *final = NULL; //用来记录最终结果//中序遍历void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); //递归遍历左子树 visit(T); //访问根节点 InOrder(T-&gt

2021-07-27 22:16:04 158

原创 5.8 线索二叉树的概念

一、线索二叉树的作用【注意】区分 ‘树的结点的前驱、后继’ 和 ‘基于遍历序列的结点的前驱、后继’【思考】如何找到一棵普通二叉树的指定结点p在中序遍历中的前驱?​ Tip:从根结点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访问的结点​ ①初始状态下,让pre—>NULL​ ②当q==p时,pre为前驱​ ③当pre==p时,q为后继​ 【缺点】找前驱、后继很不方便;遍历操作必须从根结点开始于是,有人

2021-07-27 22:14:04 187

原创 5.7 由遍历序列构造二叉树

一、不同二叉树的中序、前序、后序、层序遍历中序遍历:中序遍历左子树、根节点、中序遍历右子树前序遍历:根节点、前序遍历左子树、前序遍历右子树后序遍历:前序遍历左子树、前序遍历右子树、根节点结论:一个中序、前序、后序、层序遍历序列可能对应多种二叉树形态二、由遍历序列构造二叉树结论:若只给出一棵二叉树的 前/中/后/层 序遍历序列中的一种,不能唯一确定一棵二叉树三、由二叉树的遍历序列构造二叉树1.前序+中序遍历序列​ 前序遍历:根节点、前序遍历左子树、前序遍历右子树​ 中序

2021-07-27 22:09:38 872

原创 5.6 二叉树的层序遍历

一、算法思想初始化一个辅助队列根节点入队若队列非空,则队头结点出队,访问该结点,并将其左、右孩子插入对位(如果有的话)重复3.直至队列空二、代码实现//二叉树的结点(链式存储)typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//链式队列结点typedef struct LinkNode{ BiTNode * data; //存指针而不是结

2021-07-27 22:08:59 100

原创 5.5 二叉树的先/中/后序遍历

二叉树的遍历遍历:按照某种次序把所有的结点都访问一遍层次遍历:基于树的层次特性确定的次序规则先/中/后序遍历:基于属的递归特性确定的次序规则一、先序遍历(根左右)​ 分支结点逐层展开法操作:若二叉树为空,则什么都不做若非空:①访问根节点;②先序遍历左子树;③先序遍历右子树小方法:从根结点出发,画一条路:如果左边还有没走的路,优先往左走,走道路的尽头(空结点)就往回走,如果左边没路了,就往右走,如果左、右都没路了,就往上走先序遍历–第一次路过时访问节点(每个结点都会被路

2021-07-27 22:08:09 182

原创 5.4 二叉树的存储结构

一、二叉树的顺序存储#define MaxSize 100struct TreeNode{ ElemType value; //结点中的数据元素 bool isEmpty; //结点是否为空};//定义一个长度为MaxSize的数组t,按照从上至下,从左至右的顺序依次存储完全二叉树中的各个结点TreeNode t[MaxSize];//初始化时,所有的结点都标记为空for(int i=0;i<MaxSize;i++){ t[i].isEmpty=true;}

2021-07-27 22:06:33 302

原创 5.3 二叉树的基本概念和常考性质

一、基本概念二叉树是n(n>=0)个结点的有限集合: 1.或者为空二叉树,即n=0 2.或者由一个根节点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树有分别是一颗二叉树 3.特点: ①每个结点最多有两棵子树 ②左右子树不能颠倒(二叉树是有序树)注意区分:度为2的有序树二、几种特殊的二叉树一、满二叉树 一棵高度为h,且含有2的h次方-1个结点的二叉树 也就是每个二叉树的结点,都有两个孩子节点 特点: 1.只有最后一层有叶子节点 2.不存在度为1得结点

2021-07-27 22:05:32 268

原创 5.2 树的常考性质

树的常考性质常见考点1:结点数=总度数+1结点的度:结点有几个孩子常见考点2:度为m的树、m叉树 的区别树的度–各个结点的度的最大值任意结点的度<=m(最多m个孩子)至少有一个节点度=m(有m个孩子)一定是非空树,至少有m+1个结点​ m叉树–每个结点最多只能有m个孩子的树​ 任意结点的度<=m(最多m个孩子)​ 允许所有结点的度都<m​ 可以是空树常见考点3:​ 度为m的树第i层最多有mi−1个结点(i≥1)度为m的树第

2021-07-27 22:04:04 465

原创 5.1 树的定义和基本术语

一、基本概念根节点、边、分支结点、叶子节点空树:结点数为0的数非空树的特性: 1.有且只有一个根节点 2.没有后继的结点称为“叶子节点”(或终端结点) 3.由后继的结点称为“分支节点”(或非终端结点) 4.除了根结点之外,任何一个结点都有且只有一个前驱 5.每个结点可以有0个或多个后继二、基本术语一、结点之间的关系描述 祖先结点 子孙结点 双亲结点(父节点) 孩子结点 兄弟结点 堂兄弟结点 两个结点之间的路径:只能从上往下 路径长度:经过几条边二、结点、树的属性描

2021-07-27 22:03:17 281

原创 4.4 KMP算法

一、KMP算法代码int Index_KMP(SString S,SString T,int next[]){ int i=1,j=1; while(i<=S.length&&j<=T.length){ if(j==0||S.ch[i]==T.ch[j]){ ++i; ++j; //j } else j=next[j]; //模式串向右移

2021-07-27 22:02:22 123

原创 4.3 朴素模式匹配算法

什么是模式匹配主串:S='wangdao'子串:'wang'、'ang'、'ao'····(一定是主串中存在的才叫“子串”)模式串:'gda'、'bao'(想尝试在主串中找到的串,未必存在)串的模式匹配:在主串中找到与模式串相同的子串,并返回其所在位置int Index(SString S,SString T){ int k=1; int i=k,j=1; while(i<=S.length&&j<=T.length){ if(

2021-07-26 20:56:50 871

原创 4.2 串的存储结构

一、顺序存储//静态数组实现(定长顺序存储)#define MAXLEN 255 //预定义最大串长为255typedef struct{ char ch[MAXLEN]; //每个分量存储一个字符 int length; //串的实际长度}SString;//分配连续的存储空间,每个char字符占1B//动态数组实现(堆分配存储)typedef struct{ char *ch; //按串长分配存储区,ch指向串的基地址 int len

2021-07-26 20:55:52 103

原创 4.1 串的定义、基本操作

一、串的定义串: 即字符串(String)由0个或者多个字符组成的有限序列 一般记为:S=‘a1a2```an’(n>=0),S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符,n为串的 长度,n=0时的串称为空串(用 空集 符号表示) 注意:空格也是一种字符子串:串中任意个连续的字符组成的子序列,例如S='iPhone 11 Pro Max?' 其中:'iPhone','Pro M'是串S的子串 注意:n=0,空串也是S的一个子串主串:包含子串的串,例如

2021-07-26 20:55:10 282

原创 3.9 矩阵的压缩存储

矩阵的压缩存储一、数组的存储结构1.一维数组ElemType a[10];数组元素a[i]的存放地址=LOC+i*sizeof(ElemType); LOC:数组的起始地址,除非特殊说明,否则数组下标从0开始,从1开始,i–>i-12.二维数组ElemType a[2][4]; //2行4列的二维数组(逻辑视角)行优先存储列优先存储二、特殊矩阵普通矩阵可以用二维数组来存储1.对称矩阵(若n阶方阵中任意一个元素Ai,j,都有Ai,j=Aj,i,则该矩阵为对称矩阵)​ 对称

2021-07-26 20:53:59 352

原创 3.8 栈的应用--表达式求值

表达式求值问题一、三种算术表达式中缀表达式后缀表达式(逆波兰表达式)前缀表达式(波兰表达式)中缀表达式后缀表达式前缀表达式a+bab++aba+b-cab+c--+abca+b-c*dab+cd*--+ab*cd二、后缀表达式相关考点1.中缀表达式转后缀表达式中缀转后缀:​ ①确定中缀表达式中哥哥运算符的运算顺序​ ②选择运算符,按照【左操作数 右操作数 运算符】的方式组成一个新的操作数​ 优先原则:“左优先”:左边的运算符能先计算就先

2021-07-26 20:51:09 300

原创 3.7 栈的应用--括号匹配

括号匹配问题计算机扫描括号:(((())))---------->1 2 3 4 4 3 2 1最后出现的左括号最先被匹配(LIFO),可以用栈实现该特性((())())----->1 2 3 3 2 4 4 1每出现一个右括号,就“消耗”一个左括号(“消耗”=出栈)算法:遇到左括号就入栈,遇到右括号,就”消耗“一个左括号①扫描到右括号且栈空–右括号单身②处理完所有的括号后,栈非空–左括号单身记住:只要出现了右括号,就去找最近一次的左括号(是逻辑上最近,因为存在之前配对已出栈的

2021-07-26 20:50:18 564

原创 3.6 双端队列

双端队列前提概要:栈:只允许从一端插入和删除的线性表队列:只允许从一端插入、另一端删除的线性表双端队列:只允许从两端插入、两端删除的线性表双端队列:只允许从两端插入、两端删除的线性表输入受限的双端队列:只允许从一端插入、两端删除的线性表输出受限的双端队列:只允许从两端插入、一段删除的线性表考点:判断输出序列合法性若数据元素输入序列为:1,2,3,4,则哪些输出学列是合法的,那些是非法的?卡特兰数:(可以计算出栈中的合法出栈顺序的组合个数)KaTeX parse error: Und

2021-07-26 20:49:32 147

原创 3.5 队列的链式实现

一、用链式存储实现队列1.带头结点typedef struct LinkNode{ //链式队列结点 ElemType data; struct LinkNode *next;}LinkNode;typedef struct{ //链式队列 LinkNode *front,*rear; //队列的队头和队尾指针}LinkQueue;2.不带头结点二、基本操作1.创//初始化队列(带头结点)void InitQueue(LinkQueue &Q){

2021-07-26 20:49:00 130

原创 3.4 队列的顺序实现

队列一、用顺序存储实现队列#define MaxSize 10 //定义队列中元素的最大个数typedef struct{ ElemType data[MaxSize]; //用静态数组存放队列元素 int front,rear; //队头指针和队尾指针}SqQueue; //Sq:sequence---顺序//初始化队列void InitQueue(SqQueue &Q){ //初始时 队头、队尾指针指向0 Q.rear=Q.front

2021-07-26 20:48:17 274

原创 3.3 队列

队列的定义栈(Stack)是只允许在一段进行插入或者删除操作的线性表队列(Queue)是只允许在一段进行插入(入队),在另一端删除(出队)的线性表—图片均来自B站王道考研(侵删)队尾:允许插入的一端队尾元素:队列中最靠近队尾的元素队头:允许删除的一端队列.VS.栈:队列:(FIFO):First in First out栈:(LIFO):Last in First out队列的基本操作用顺序存储的方式实现队列创:InitQueue(&Q):初始化队列,构造一个空队列Q销:

2021-07-26 20:47:17 59

原创 3.2 顺序栈

顺序栈用顺序存储方式实现的栈#define MaxSize 10 //定义栈中元素的最大个数typedef struct{ ElemType data[MaxSize]; //静态数组存放栈中元素 int top; //栈顶指针}SqStack;数组可以直接声明,静态声明的,已经分配好了内存了,之前那些需要分配内存的,是只声明了一个指针,而没有给指针执行具体的内存空间基本操作创(初始化)void InitStack(SqStack &S){

2021-07-25 18:30:43 81

原创 3.1 栈

栈(Stack)栈是只允许一端进行插入或删除操作的线性表栈顶:允许插入和删除的一端栈底:不允许插入和删除的一端空栈:最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底如果进栈顺序如下: 出栈顺序就是a5->````->a1a1->a2->a3->a4->a5则,a5是栈顶元素,a1是栈底元素特点是:后进先出Last In Fist Out (LIFO)InitStack(&S):初始化栈。构造一个空栈S,分配内存空间DestoryStac

2021-07-25 18:28:33 110

原创 2.8.顺序表.VS.链表

Round 1:逻辑结构都属于线性表,都是线性结构Round 2:存储结构都属于线性表,都是线性结构顺序表(顺序存储)链表(链式存储)优点:支持随机存取、存储密度高优点:离散的小空间分配方便,改变容量方便缺点:大片连续空间分配不方便,改变容量不方便缺点:不可随机存取,存储密度低Round 3:基本操作静态分配:静态数组(系统自动回收空间)动态分配:动态数组(malloc、free(需要手动free))typedef struct{ ElemType

2021-07-25 18:20:27 129

原创 2.7.静态链表

图片均来自B站王道考研(侵删)1.静态链表:静态链表:分配一整片连续的内存空间,各个节点集中安置静态链表的每个节点,都包含了:数据元素、下一个结点的数组下标(游标),游标充当“指针”,单链表中每个节点存放的指针,只不过指针指明了具体的内存地址,而游标指明了下一个元素存放的数组下标单链表中的表尾元素的*next指针指向NULL,而在静态链表中如果想表示这个结点是最后一个节点,则可以将它的游标设置为-1(即游标为-1表示已经到达表尾)0号结点充当头结点设每个元素的大小为4B,每个游标的大小也为4

2021-07-25 18:19:24 255

原创 2.6.循环链表

图片均来自B站王道考研(侵删)循环链表:1.循环单链表typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;//初始化一个循环单链表bool InitList(LinkList &L){ L = (LNode *)malloc(sizeof(LNode)); //分配一个头结点 if(L==NULL) //内存分配失败 return fals

2021-07-25 18:17:36 83

原创 2.5.双链表

图片均来自B站王道考研单链表.VS.双链表:单链表:无法逆向检索,有时候不太方便双链表:可进可退,存储密度更低一点双链表:1.初始化(带头结点)typedef struct DNode{ //定义双链表节点类型 ElemType data; //数据域 struct DNode *prior,*next; //前驱和后继指针(prior.先前的)}DNode,*DLinkList;//初始化双链表bool InitDLinkList(DLinkList &am

2021-07-25 18:13:01 212

原创 2.4.单链表的建立

图片均来自B站王道考研单链表的建立:1.尾插法(与后插法相联系,在表尾进行后插操作)LinkList List_TailInsert(LinkList &L){ //正向建立单链表 int e; //设置ElemType为int L = (LNode *)malloc(sizeof(LNode)); //建立头结点 LNode *s,*r=L; //r为表尾指针 scanf("%d",&e); //输入节点的值

2021-07-25 18:02:32 140

原创 2.3.单链表的查找

图片均来自B站王道考研查找1.按位查找:GetElem(L,i)//按位查找,返回第i个元素(带头结点)LNode * GetElem(LinkList L,int i){ if(i<0)//带头结点,头结点可以认为是第0个结点 return NULL; LNode *p; //指针p指向当前扫描到的结点 int j = 0; //当前p指向的是第几个结点 p = L; //L指向头结点,头结点是第0个结点(不存数据) while(p!

2021-07-25 18:00:39 263

原创 2.2.单链表的插入删除

图片来自B站王道数据结构视频插入1.按位序插入(带头结点)//在第i个位置插入元素e (带头结点)bool ListInsert(LinkList &L,int i,ElemType e){ if(i<1) return false; LNode *p; //指针P指向当前扫描到的节点 } 这几行的目的是 int j = 0; //当前p指向的是第几个结点 } 为了 p = L; //L指向头节点,头结点

2021-07-25 17:54:27 155

原创 2.1.单链表的定义

用代码定义一个单链表typedef struct LNode{ ElemType data; struct LNode *next;}LNode,*LinkList;#include<stdio.h>#include<stdlib.h>typedef struct LNode{ //定义单链表的节点类型 ElemType data; //每个节点存放一个数据元素 struct LNode *next; //指针指向下一个节点}L

2021-07-25 17:47:39 1554

6.循环链表定义及操作.md

6.循环链表定义及操作.md

2021-07-25

5.双链表的简介.md

5.双链表的简介.md

2021-07-25

4.单链表的建立.md

4.单链表的建立.md

2021-07-25

3.单链表的查找.md

3.单链表的查找.md

2021-07-25

2.单链表的插入删除.md

2.单链表的插入删除.md

2021-07-25

1.单链表的定义.md

1.单链表的定义.md

2021-07-25

Python入门.ipynb

关于Python的print()函数以及三种基础的数据类型之间的转换:int()、float()、str();type()函数用来查看括号内的数据的数据类型;四则运算的注意事项以及一些用法

2020-06-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除