![](https://img-blog.csdnimg.cn/041f6f91460244759d1c944f7c19cb8b.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 85
时间复杂度、线性表(顺序表、单链表、双链表、栈、队列)、二叉树、常用排序算法:插入(直接插入、希尔)、选择(选择、堆)、交换(冒泡、快速)、归并
孙同学要努力
这个作者很懒,什么都没留下…
展开
-
【数据结构】二叉树必刷的OJ题 二叉树的遍历 最大深度 平衡二叉树
其实,我们在使用C语言的时候,就发现C语言的缺陷了,C语言没有自己的容器,不支持泛型编程。如果我们会C++的话,使用库里面的容器,大小不需要我们计算,他自己会算。我们采用分治的思想,如果根为0,就返回0,如果根不为0,我们就返回根的左子树的深度和根的右子树的深度较大的那一个,然后 + 1。我们掌握了二叉树的前序遍历,中序和后序遍历只需要改一下根、左子树、右子树的访问次序就可以了。总结:二叉树的很多问题可以采用。原创 2022-09-04 15:54:29 · 405 阅读 · 0 评论 -
【数据结构】二叉树 二叉树的深度优先遍历和广度优先遍历 完全二叉树和满二叉树的性质 二叉树的节点个数以及叶子节点个数
设二叉树的根节点所在的层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的根节点,然后从左到右访问第二层上的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程就是层序遍历,也称为广度优先遍历。因为我们定义了一个全局的size,在我们计算了节点为A的节点个数时,得到的大小是5,但是在计算节点为B的节点个数为8,。但是,如果我们知道多线程的时候,程序在运行时,可能有多个进程在同时进行,我们就无法保证在求一个节点的数时的节点前,先把size赋值为0了。看下面的代码就很好的解决了这个问题。原创 2022-09-03 15:02:14 · 1282 阅读 · 0 评论 -
【数据结构】经典问题——迷宫 回溯法
给我们一个 n * m 的二维数组,让我们从坐标(0,0)的位置走到坐标(n-1,m-1)的位置,其中0表示通路,1表示墙壁。只能上下左右的走,不可以斜着走。迷宫的游戏我们应该都有玩过,就是我们不断尝试从起点到达终点的过程,中间会有墙壁阻碍着我们,我们就不得不再另找其路。原创 2022-09-02 15:49:26 · 1011 阅读 · 0 评论 -
【数据结构】手撕排序算法(下)完美散花 快速排序的非递归、归并排序的非递归(校招、面试必掌握)、基数排序(桶排序)、计数排序、七大排序的性能测试以及总结
在上面两篇文章中,我们分别学习了插入排序(直接插入排序、希尔排序)、选择排序(直接选择排序、堆排序)、交换排序(冒泡排序、快速排序的递归写法)、归并排序的递归写法。那么,在这一节中,我们将学习快速排序的非递归写法、归并排序的非递归写法。以及,我们还要掌握最后两种不是很常见的排序,一个是基数排序(桶排序),一个是计数排序。最后我们要对我们所学的七大排序的性能进行测试和总结。计数排序就是统计每个数出现的次数。我们需要开辟一个数组,数组的长度由这组序列中最大的那个数来决定。计数排序是一种非比较排序。...原创 2022-08-31 15:09:43 · 316 阅读 · 0 评论 -
【数据结构】手撕排序算法(中)交换排序 (冒泡排序、快速排序的递归方式(挖坑法、前后指针法、左右指针法))、归并排序的递归方式
搞懂快速排序,什么排序都不怕!在上一节中,我们已经掌握了插入排序(包括直接插入排序和希尔排序)和选择排序(直接选择排序和堆排序);在这一节我们主要讲述选择排序(冒泡排序和快速排序)和归并排序的非递归形式。......原创 2022-08-28 16:29:47 · 264 阅读 · 0 评论 -
【数据结构】手撕排序算法(上)—— 插入排序(直接插入、希尔) 选择排序(直接选择、堆排序)
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保不变。即在原序列中,r[i] = r[j],且 r[i]在 r[j]之前,而在排序后的序列中,r[i]容在r[j]之前,则称这种排序算法是稳定的;那么在剩下的数中再去选数,但是剩下的树结构已经乱了,需要重新建堆才能选出下一个数,建堆的时间复杂度是O(N),那么这样不是不可以,但是堆排序就没有效率优势了。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。原创 2022-08-25 16:22:44 · 812 阅读 · 3 评论 -
【数据结构】队列的实现
/队列节点结构 typedef struct QueueNode {//节点指针 QDataType data;//节点数据 } QNode;//队列的链式结构 typedef struct Queue {//队头指针 QNode * ptail;//队尾指针 } Queue;原创 2022-08-19 16:42:32 · 355 阅读 · 0 评论 -
【数据结构】栈的实现
栈是一种特殊的线性表,只允许在表尾进行插入和删除元素的操作。进行数据的插入和删除操作的一端称为栈顶,另一侧称为栈底。栈中的数据元素严格遵循后进先出LIFO(Last in First Out)的原则。压栈:栈的插入操作称为进栈/压栈/入栈,插入的数据在栈顶出栈:栈的删除操作称为出栈,删除的数据也在栈顶在顺序表里面我们就讲过,顺序表分为静态顺序表和动态顺序表。静态顺表不够灵活,容量或多或少,不能由我们控制。所以我们要用支持动态的栈。...原创 2022-08-18 16:24:08 · 1475 阅读 · 0 评论 -
【数据结构】双向链表(带头双向循环链表)——超详细代码
在上一篇文章我们已经介绍了链表的分类,链表的种类非常多,分为带头还是不带头、单向的还是多向的、单向还是双向循环……上一节我们学习了不带头单向的不循环的链表,这一节,我们主要实现带头双向循环的链表。如果我们把这两种结构的链表掌握的话,那么所有类型的链表我们都可以自己实现了带头双向链表有一个数据域和两个指针域。指针域一个是前驱指针,指向前一个节点,一个是后继指针,指向后一个节点。//前驱节点 struct ListNode * next;//后继节点 LTDataType data;//数据域 };...原创 2022-08-15 16:28:13 · 1901 阅读 · 0 评论 -
【数据结构】单链表(超详细讲解)c代码实现
传值只是创建一个临时变量phead,只会改变phead的值,并不会改变我们想要的plist的值。当我们传plist的值时,因为当链表为空时,我们要创建第一个节点,我们要改变plist的指向,让他指向第一个节点。当链表不为空时,先要找到链表的最后一个节点,然后将尾结点的next指向新节点。思路一:找到单链表尾结点的上一个节点,通过上一个节点的next指针,找到最后一个节点。所有节点的地址不是连续的,链表在物理结构上不一定是线性的,但在逻辑结构上是线性的。的方式实现的,通过指针的指向,可以使链表。...原创 2022-08-13 15:45:23 · 1817 阅读 · 0 评论 -
【数据结构】顺序表的实现——超级无敌详细
在当我们每想插入一个数据的时候,我们都要对顺序表进行判断,容量 capacity 是否和 size 相等,如果相等的话,那么,顺序表的空间就不够我们进行插入数据了。当然我们不能需要插入一个数据就开辟一个数据的大小,这样的话,付出的代价很大,我们可以每次增容 2 倍的capacity大小的容量,或者4倍,2倍是比较好的了。在我们想把顺表表最后一个数据删除时,不能直接赋为0,第一,我们不知道SLDataType到底是什么数据类型,第二,顺序表的最后一个数据有可能就是0,没有意义。遍历一遍顺序表,打印顺序表。..原创 2022-08-07 18:10:44 · 2082 阅读 · 1 评论