自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 数据结构:4.1.2二叉搜索树的插入

BST)这一段程序什么时候执行呢(可以参考原视频,讲得非常好4:17前后)所谓的顺序就是字典顺序, 字母在字典中在前面的就是小的,在后面的就是大的。35>33 向33的右子树,但33右边为空,所以35就挂在33的右边。整个框架和FInd函数的实现是一样的,但是也有不同(注意)因为要把35挂在33的右边,所以要把33的位置记下来。对于这个过程的解释第一遍没有看懂,多看几遍!35>30 向30的右子树。35<41 向41的左子树。

2024-06-19 16:31:56 271

原创 数据结构:4.1.1二叉搜素树及查找

实现的方式不仅是递归而且是尾递归, 即程序最后要返回的时候递归,从遍历的角度讲尾递归都可以用循环来实现。静态查找:要找的集合的元素是不动的,主要是find操作,没有delete操作。所以我们喜欢的是平衡一点的树,这就是之后要学的二叉平衡树。Find函数两个参数,一个要查找的元素X,一个树BST。而 对同样的n个结点来说,查找的效率又与树的结构有关。动态查找:要查找的集合会经常发生插入删除的操作。结点右子树的值>结点的值>结点左子树的值。静态查找的一个很好的方法就是二分查找。为什么这两个程序的写法不一样啊?

2024-06-19 15:44:49 177

原创 数据结构:小白专场:树的同构2程序框架、建树及同构判别

为了处理方便,三个信息读入的时候都处理成字符的方式读进来,left和right再把字符处理整数再放到left和right里面去。上一篇文章介绍过一种思路,扫描一下 所有结点,看哪个结点没有被其他结点的left right指向。(把left从字符处理成整数再放到T[i].Left中去)T1T2是之前提到的结构数组,是全局变量,作为参数传进去。调用Ismorphic这个函数判断R1R2是不是同构的。知道n之后,n不为0,循环,循环一次读入一行数据。check用的是一个数组吗。

2024-06-19 15:06:56 194

原创 数据结构:树的同构

基本的存储用数组,把需要的结点信息存储在数组中, 但左右儿子用类似链表的方式来表示 ,有一个 数据来指示左儿子右儿子在哪里。数组里的每个分量是一个结构, 每一列是数组的一个分量,这是一个结构。NULL在stdlb.h中的定义是0,空指针是0,它的值实际上是0,在这里不能有NULL(因为0也是下标!因为这种表示方法的灵活性,所以它具有链表的灵活性,但是它是使用数组进行表示的,所以称为“静态链表”数组正常的下标是从0开始的,怎么表示指向一个空的结点?二叉树的表示不是唯一的,且ABCD的顺序可以改变。

2024-06-18 19:49:33 384

原创 数据结构:第三讲 树(上)小测验:树的遍历

(2)利用根在中序中分左右子树。

2024-06-16 11:42:27 186

原创 数据结构:3.3.4遍历应用例子

它的作用是比较HL和HR两个值的大小,如果HL大于HR,则将MaxH赋值为HL,否则将MaxH赋值为HR。换句话说,这段代码选择HL和HR中较大的那个值,并将其赋给MaxH。**三元操作符(又称条件运算符)是编程语言中的一种简洁的条件判断语法。二叉树的高度等于左右子树的最大高度加上一。(原因:先序是根左右,后序是左右根,根容易确定,但是不知道左右的边界在哪)求树高的前提,要先知道左右子树的高度➡️所以要去改变后序遍历的程序。树是递归定义的,所以思考求二叉树高度能不能用递归做。例子二:求二叉树的高度。

2024-06-16 11:09:37 390

原创 数据结构:3.3.3层序遍历

用堆栈来保存:自己或者右儿子(在堆栈里实现的是保存自己这个结点)。用堆栈保存的过程:自己访问完了访问左儿子,把自己保存起来,这样将来回来的时候可以去访问右儿子。二叉树转为一维序列过程中的一个问题:一个结点只关联两个结点,访问了其中的一个另一个怎么办,另一个要把它存起来。如果不访问父亲结点是访问不到左儿子和右儿子的,如果把父亲忘了左右儿子也是找不到的。用队列来保存:保存的是未来要访问的结点(也就是右儿子结点)。二叉树的核心问题:把二维的结构变为一维的线性序列。采用不同的方法就会产生不同的一维的序列。

2024-06-16 10:12:41 202

原创 数据结构:3.3.2中序非递归遍历

第二步:while(T)跳出来了,判断堆栈空不空,堆栈不空,pop一个出来,刚刚pop的结点赋给T,把T的值printf出来,T往右走。(我的一种理解:每个结点可以理解为同时有多种身份,它被printf的时候一定是作为根存在的)while循环的两个条件:(T):树不空;D若有右儿子,则往右边走,而在这里D没有右子树➡️B出栈➡️往B的右边走。第一步:while(T)树不空,就把结点压入堆栈,一直到T为NULL。注意⚠️:G结点没有左子树,H为G的右子树。看一下用堆栈实现中序遍历的碰到结点的顺序。

2024-06-05 16:31:56 288

原创 数据结构:3.3.1先序中序后序遍历

(traversal n.[计] 遍历;路线一样访问时间不同(即printf时机不同)后面以二叉树的链式存储为主,研究二叉树的遍历。第一次碰到就访问(printf)叫做先序。第二次碰到就访问(printf)叫做中序。第三次碰到就访问(printf)叫做后序。这里所谓的访问就是printf一下。在递归的基础上画出这个路线图。每个结点都会被路线经过三次。

2024-06-05 14:47:34 208

原创 数据结构:小测验(二叉树的性质)

等一下我感觉这个图是不是画得不太对。

2024-05-25 20:08:12 200

原创 数据结构:3.2.2二叉树的存储结构

有一种二叉树用数组实现非常方便,那就是完全二叉树,因为完全二叉树除了最下面一层,其他结点全部放满了,可以从上到下,从左往右对它进行编号(层次遍历)然后思考用数组实现了之后查找是否方便(能否找到顺利找到他的父亲儿子)首先考虑有没有可能用数组实现,二叉树比较简单。可以,把缺的地方补上,相应缺的结点留下空位。普通二叉树可以使用这种方法吗?

2024-05-25 19:45:11 107

原创 数据结构:3.2.1二叉树的定义及性质

完美二叉树(满二叉树)和完全二叉树对比:完全二叉树可以可以缺掉最后的结点。斜二叉树:实际上就是一个链表,形成了一种线性结构。下面这张图就不是完全二叉树。下面这张图是完全二叉树。

2024-05-25 18:00:29 309

原创 数据结构:3.1.5树的表示

缺点:会有很多空,假设有n个结点,每个结点有3个指针域,那么整个树就会有3n个指针域,实际上的指针只有n-1个(只有n-1条边),这样的话就有2n-1个空的会造成一种空间上的浪费。每个结点的结构一样,有两个指针域,一个指向它的儿子结点(我觉得这里要强调一下第一个儿子结点🤔),第二个指向兄弟结点。得到一个新的树,每个结点有两个指针,一个指向左边,一个指向右边,每个结点最多两个儿子,这个就叫二叉树 (二叉树就是度为2的这样一种树)如下图表示n个结点,有2n个指针域,(n-1)个边,空的域为n+1。

2024-05-24 18:16:51 148 1

原创 数据结构:3.1.4树的定义和术语

树是保证结点联通的最小的一种结构方式。

2024-05-23 23:10:55 211 1

原创 数据结构:3.1.3二分查找实现

推广:可以把数据按照查找树这样的结构来存储,从而在查找时有很好的效率,即查找树。List中的分量:一个是数组Element,一个是它的大小Length。深度:假设n=11,log2n取整为3,3+1=4。查找树的复杂度可以达到接近log2n的效果。在树中插入结点删除结点比在数组中方便得多。K:想在已经排序好的数组中找一个元素k。查找树可以很好的解决动态查找问题。为什么二分法效率这么好?ASL:平均成功查找次数。

2024-05-22 16:53:03 162 1

原创 数据结构:3.1.2 二分查找例子

前提:数组里面元素必须有序存放。

2024-05-22 15:14:06 71

原创 数据结构:3.1.1引子 顺序查找

已知要在这个数组中查找K(那么值等于K就是循环中止的一个条件),将哨兵的值赋为K, 就算没找到K,也会跳出循环。(没有哨兵是不是每一次循环都要判断边界啊?答:是的,所以写了哨兵就可以在循环中少写一个判断的分支)这样跳出循环就有两种可能的原因,通过i的值判断,是找到了K还是没有。这个结构有两个分量:一个是指针指向 数组的头。一个是10(代表这个数组中放的元素有多少个)注意观察,这个数组不是从0开始存储。这是程序设计中的一种技巧,叫做哨兵。(2)碰到边界:通过下标来判断。在数组的循环中不断去找下一个。

2024-05-21 11:42:26 154 1

原创 2.线性结构(小白专场)3.加法,乘法运算及多项式输出

需要删掉(注意删掉的是什么,不是当前的rear,是当前rear后面的一个结点,即rear->link)(1)怎么把p1的第一项乘p2的每一项构成初始多项式(这个初始多项式是干嘛的?(2)rear的后面一项的expon小于要插入的expon,rear停止移动,要插入的项插在rear后面。(1)rear的下一项的expon比要插入的expon大,rear往后移动。(3)rear的后面一项的expon的等于要插入的expon,coef相加。(1)怎么把p1的第一项乘p2的每一项构成初始多项式。

2024-05-21 10:37:16 143

原创 2.线性结构(小白专场)2.程序框架及读入多项式

从左到右读入,而且先读的是指数高的一项,所以先插入指数高的到链表中,再把指数低的插到后面去,所以需要一个rear指向最后一项,这样读入c和e(在attach的作用下组成一个结点),就插到目前最后一项的后面。采用方法2,attach函数的形参解释:c和e,当前最后一个结点的指针位置(传入Polynominal这个类型的指针,注意Polynominal本身也是指针,所以传进来的pRear是指针的指针,)加法运算:把P1,P2传给Add函数,做完运算之后返回一个新的节点的指针。p=p->link;

2024-05-20 17:11:22 420 1

原创 2.线性结构(小白专场)1.题意理解与多项式表示

2024-05-18 18:41:06 107

原创 数据结构:堆栈测验题(关于单向链表实现堆栈到底谁是栈顶)

是不是因为链表的特性,首可以插入删除,但是尾只能 插入不能删除。

2024-05-18 18:24:30 92

原创 数据结构:2.4多项式的加法运算实现

Attach函数有三个参数,第一个第二个分别代表要拷贝的系数和指数,然后把系数和指数形成的新的项接到rear的后面,然后p1或者p2往后挪(好牛的函数)最后要return回去结果多项式的第一个结点,所以要记住结果多项式的头在哪里 ,还要记住尾巴,因为不断要把新的项加到结果多项式的后面。**注意:传进来的是Polynominal这个类型的指针,Polynominal本身就是指针,所以这里的pRear实际上是指针的指针。因为pRear代表指针的指针,所以*pRear就代表指针了 ,指向当前列表的最后一个结点。

2024-05-16 21:08:46 344

原创 数据结构:队列小测验及讨论(2.3)

2024-05-16 19:38:12 379

原创 数据结构2.3.2队列的链式存储和实现

先判断队列是否为空(看front是否为NULL:若front为NULL则表明front不指向任何东西)判断队列中是否只有一个结点,如果只有一个,队列头去掉了之后PtrQ->rear也要变。front和rear分别负责删除和插入,头删除(front),尾插入(rear)用PtrQ来指示队列(PtrQ是一个包含front和rear的指针)若不止一个,拿去头之后 PtrQ->rear不变的。不为空,让front找到队列头上的一个元素。front是设在链表的头还是链表的尾?链表中的每个结点都是定义的Node。

2024-05-16 11:58:46 142

原创 数据结构2.3.1队列及顺序存储的实现

rear指向的是实际最后一个元素的位置,而front指向的是第一个元素的前面的一个位置,档front==rear说明队列为空,但队列满的时候也有front==rear。例子:MaxSize=5,3+1%5=3+1,而4+1%5=0(5表示数组的大小吗?0,1,2,3,4)**注意理解+1求余的操作,在最后一位时+1求余会变为0,但是其他地方+1求余==+1,一开始的时候front和rear都是-1(实际上front指的是头元素前面的一个元素)如果有个数组大小为n,那么front和rear之间的差距有6种。

2024-05-16 11:31:27 135

原创 数据结构2.2.4 堆栈应用:表达式求值

碰到除号,除号和堆栈中的乘号优先级一样,遵循从左到右的原则,先把乘号丢出来。*左括号优先级比乘号高,乘号又比加号高,这里能不能把左括号拿出来计算?*同样的运算符号,在堆栈外面和堆栈里面优先级是不一样的,主要是指左括号。记下:+ / (不计算,万一后面还有优先级更高的)不能,左括号一旦拿到堆栈里,优先级就降为最低。再往下一个,出现-,放心了,/可以输出了。遇到右括号,开始抛出符号,直到碰到左括号。输出:2 9 3 / 5 - +记下: + (先不急着计算)输出:2 9 3 / 5-输出:2 9 3 / 5。

2024-05-16 09:54:55 203

原创 数据结构2.2.3堆栈的链式存储和实现

堆栈的Pop函数 需要先判别有没有空,而push函数不需要判断有没有满:因为用的是链表而不是数组,使用数组实现堆栈则需要判断有没有满。单向链表头可以作为top尾巴不能作为top,若用尾巴作为top,可以完成插入操作但不能完成删除操作。CreateStack是为堆栈创建头结点的函数(可以说头结点后的一个元素才真正是堆栈中的元素。链表是不断申请空间,往里面插(既然已经申请了空间,那么删除结点的时候也要free,释放空间)插入新结点一定要先用malloc函数申请空间。

2024-05-15 16:38:04 111

原创 数据结构2.2.2 堆栈的顺序存储的实现

先把top的值加一,再把item放在新的top位置,所以++放在(ptrS->Top)前面。数组的最后一个位置在MaxSize-1,MaxSize已经在数组外面了。不懂PtrS->Data[(PtrS->Top1)++]这种写法。不能这样表示,因为top1和top2都是数组的下标。同理第一个位置在0;top-1表示堆栈空。

2024-05-15 15:47:53 194

原创 数据结构2.2堆栈

elemtype是元素的类型,在算法中,除特别说明外,规定ElemType的默认是int型。数据结构是讨论抽象的数据存储和算法的,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程中用“elemtype”代表所有可能的数据类型,简单明了的概括了整体。堆栈是一种线性结构,也是一种特殊的线性表。ElementType是什么类型。

2024-05-10 13:41:23 193

原创 数据结构2.1.6广义表与多重链表

有两个指针,一个指向行,一个指向列,把同一行同一列都设计为“循环链表”,一个结点又属于行又属于列叫做十字链表。union可以把不同的类型的数据结合在一起,可以把这个空间理解成某种类型也可以理解为另外一种类型,怎么区分呢,用一个tag作为标记。是整个稀疏矩阵的入口,表示这个矩阵4行5列非0项个数共有7个。例如tag=0表示结点是单元素,tag=1表示结点是一个指针,指向另一个广义表。为什么在多重链表中第i行第i列的head实际上是同一个结点啊?所谓多重链表指的是一个节点可能同时隶属于多个链表。

2024-05-08 16:57:12 255

原创 数据结构2.1.5链式存储的插入和删除

的话这样在使用Insert的时候可以写PtrL=Insert();这样就能在调用完Insert函数之后返回更新头节点!【这样写不太对啊,要用两个指针,s和p,s指向i-1,p指向i,s->next=p->next】[和我想得一样哈哈哈哈哈,删除的i节点当时是用malloc申请的空间,现在不用了要用free把空间还回去free(p)]因为插在1的位置,头节点发生了变化,所以要return s;如果i=1,i-1=0不存在,所以要单独讨论i=1的情况。删除:删除i,要找i-1位置。也要讨论i=1的情况。

2024-05-08 15:43:50 207

空空如也

空空如也

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

TA关注的人

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