数据结构杂谈
文章平均质量分 87
本专栏是小编在学习数据结构时整理的笔记。
南桥几晴秋
阿里云乘风破浪计划专家博主 笔记分享 脚踏实地
展开
-
红黑树(RBTree)
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。原创 2024-08-21 10:40:46 · 618 阅读 · 12 评论 -
详谈平衡二叉搜索树(AVL树)
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。原创 2024-08-16 16:05:04 · 833 阅读 · 13 评论 -
二叉搜索树
一句话总结就是,左子树比根小,右子树比根大,每个树都要满足这个特征。,相同,没有意义,默认定义,搜索树不允许有冗余。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二。树刚开始就为空,那么根节点就是空的,我们只需要在根节点开辟一个节点,存放。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。b. 树不空,按二叉搜索树性质查找插入位置,插入新节点。b、最多查找高度次,走到到空,还没找到,这个值不存在。叉搜索树的深度的函数,即结点越深,则比较次数越多。原创 2024-08-08 10:04:34 · 730 阅读 · 8 评论 -
直接插入排序和希尔排序
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。原创 2023-12-26 21:56:32 · 1880 阅读 · 21 评论 -
二叉树遍历及应用
二叉树的遍历及应用主要是运用了递归、分治的思想。在这一篇文章,小编将介绍二叉树的前序遍历、中序遍历、后序遍历,求二叉树结点个数、叶节点个数、第K层结点个数、二叉树的深度。原创 2023-12-02 18:55:46 · 791 阅读 · 7 评论 -
堆的应用:堆排序
堆排序,顾名思义是一个利用堆来完成排序的一个操作。在之前,小编在[C语言学习系列–>【关于qsort函数的详解以及它的模拟实现】]谈到冒泡排序,但是冒泡排序的时间复杂度(O(n2))着实有点高,堆排序的时间复杂度相对低很多,O(log2N)。原创 2023-11-27 21:25:02 · 718 阅读 · 7 评论 -
堆的实现(C语言版)
如果有一个关键码的集合K = {k0,k1,k2…kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki= K2*i+1) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。原创 2023-11-24 11:09:29 · 1133 阅读 · 0 评论 -
手把手设计C语言版循环队列(力扣622:设计循环队列)
队列会出现“假溢出”现象,即队列的空间有限,队列是在头和尾进行操作的,当元素个数已经达到最大个数时,队尾已经在空间的最后面了,但是对头前面的不一定是满的。针对这一现象,引入了循环队列。循环队列也是一种数据结构,小编在本篇文章中,是以力扣的一道题目为例来设计循环队列。此时队尾rear已经到最后面了,但是队头front前面没有填满元素,因此并没有满循环队列就是将队尾rear再次回到数组的前面,解决“假溢出”的现象继续在队尾rear插入元素,直到真的满了。原创 2023-11-21 18:17:03 · 435 阅读 · 17 评论 -
线性表->栈
栈相对于链表,稍微简单一点,但是栈的难点在于通过栈去理解递归算法。**栈:**一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。**压栈:**栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。**出栈:**栈的删除操作叫做出栈。出数据也在栈顶。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。原创 2023-11-13 21:34:42 · 256 阅读 · 5 评论 -
带头双向循环链表
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。双向循环链表含有一个头节点(哨兵位),含有两个指针域,next,prev,分别指向节点的后继和前驱。需要注意的是,头节点的prev指向尾节点,尾节点的next指向头节点看着复杂,实际操作起来很简单。原创 2023-11-13 21:04:50 · 547 阅读 · 5 评论 -
单链表(无头单项非循环)
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的形式有很多,本篇文章主要介绍的是单链表且无头结点。在严版数据结构(C语言 第2版)中,单链表采用的是有头节点,这两种形式,各有利弊。含头节点的单链表在学习时,可能会容易些,但是在实践中或者在力扣中做题时,很少会有带头节点。但是有时候做题,使用带头节点的单链表会简单许多,不常见。一个结点有两个部分组成,数据域(val),指针域(next)。原创 2023-11-06 20:21:05 · 332 阅读 · 22 评论 -
超详细的顺序表(附源码)
顺序表是线性表的一种,代码量对于前面的学习,有明显的难度。小编也是第一次学习数据结构,如有谬误,欢迎指正。本篇收录于《数据结构杂谈》中。原创 2023-10-14 14:37:26 · 302 阅读 · 27 评论