自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构学习之路(十二)----哈夫曼树:从原理到代码实现

哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。在数据压缩领域,哈夫曼树有着广泛的应用,哈夫曼编码就是其在电讯通信中的经典应用之一。路径与路径长度:在一棵树中,从一个结点到另一个结点所经过的通路称为路径,路径上所经过的边的数量就是路径长度。从根结点到第 i 层结点的路径长度为 i-1。结点的权:给树中每个结点赋予的一个有某种意义的数值。结点的带权路径长度:从根结点到该结点的路径长度与该结点权值的乘积。树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。

2026-07-18 11:06:43 390

原创 数据结构学习之路(十一)----并查集 Quick-Union 的 Size 优化

/ 存放元素数组int n;// 并查集中元素的总个数// 父节点索引数组int* size;// 仅根节点有效,记录该树的大小data存储实际的元素值(如字符、整数等)。是索引i对应的父节点索引。size[i]仅在i是根节点时有意义,记录该集合的大小。并查集的 Size 优化是一种简单而有效的平衡策略,它将合并操作的时间复杂度从 O(n) 降低到 O(log n),是并查集高效运行的基础。结合路径压缩后,可达近乎常数时间的性能,使其成为图论、连通性问题中的利器。

2026-07-17 21:44:41 314

原创 数据结构学习之路(十)----QuickFind:最直观的并查集实现

/ 并查集对应索引的数据信息,比如一个个字符// 并查集对应索引的数据所归类的组ID信息int n;// 当前并查集里的元素个数这里定义了一个data数组存储具体的元素值(类型为Element_t,这里用char表示)。groupID数组存储每个元素所属的组号(集合编号)。n表示并查集中元素的个数。QuickFind 是并查集家族中最直观的实现——用数组存储每个元素的"组号",查找只需 O(1),合并需要 O(n)。用集合的代表元素来标识整个集合。

2026-07-15 22:19:33 261

原创 数据结构学习之路(九)----平衡二叉树(AVL树)深入解析:从原理到C语言实现

AVL树(Adelson-Velsky and Landis Tree)是最早发明的自平衡二叉搜索树。它要求任一节点的左、右子树高度差的绝对值不超过 1,这个高度差称为平衡因子(Balance Factor)平衡因子 = 左子树高度 - 右子树高度在AVL树中,每个节点的平衡因子只能取-1、0、1,分别对应右子树较高、等高、左子树较高。优点:严格的平衡保证了最坏情况下的高效查找,适合查找密集型应用。缺点:插入和删除的旋转开销较大,对于频繁更新的场景,红黑树可能更优。

2026-07-14 15:20:24 444

原创 数据结构学习之路(八)----二叉搜索树(BST):从原理到代码实现

二叉搜索树(Binary Search Tree,BST),也叫二叉排序树或二叉查找树,是在普通二叉树的基础上增加了有序性约束的一种数据结构。它的核心规则很简单:若左子树不空,则左子树上所有结点的值均小于根结点的值若右子树不空,则右子树上所有结点的值均大于根结点的值左右子树同样满足上述规则这个递归定义保证了整棵树的中序遍历结果是一个从小到大排好序的序列,这也是二叉搜索树名字中“搜索”二字的由来。// 节点存储的数据// 左子树指针// 右子树指针} BS_Node;int count。

2026-07-12 17:21:30 329

原创 数据结构学习之路(七)----二叉树中序线索化分析及代码

中序线索二叉树巧妙地利用了原本空闲的指针,将遍历过程从递归/栈依赖转变为线性迭代,同时提升了前驱后继的查找效率。本文通过完整的C语言实现,展示了线索化、遍历以及内存管理的全部细节,希望对理解二叉树的高级存储结构有所帮助。在实际工程中,线索化虽然带来性能提升,但也会增加维护成本(插入、删除时需要更新线索),因此需要根据具体需求权衡使用。(PS:煮播终于熬过期末周了QAQ)

2026-07-11 18:16:22 289

原创 数据结构学习之路(六)----前序,中序,后序,层序遍历代码实现

我们使用经典的二叉链表存储结构,每个节点包含数据域和左右指针,整个树用一个结构体管理根节点和节点总数。// 数据元素类型,此处用int,但测试时使用字符// 二叉树头节点,记录根和节点数量int num;// 树中节点总数。

2026-06-23 22:15:33 169

原创 数据结构学习之路(五)----树与二叉树:从基础到线索化的全面解析

树(Tree)是 n≥0 个节点的有限集合,满足:有且仅有一个根节点(Root);其余节点分为 m≥0 个互不相交的有限集合,每个集合本身也是一棵树,称为子树。这种定义具有递归性,即“树中还有树”。二叉树是每个结点最多有两个子树的树结构,不允许存在度大于2的结点。将空指针指向结点的前驱或后继,称为线索化。指向这些关系的指针称为线索。树和二叉树是数据结构中的核心内容,理解它们的定义、存储结构、遍历方式以及线索化优化,是学习更复杂数据结构(如堆、哈夫曼树、二叉搜索树等)的基础。

2026-06-14 20:26:45 375

原创 数据结构学习之路(四)----深入浅出队列:从顺序队列到链式队列

顺序队列使用一段连续的内存空间(如数组)来存储队列元素。front:指向队头元素的位置(或前一个位置,具体取决于实现)。rear:指向队尾元素的位置。初始时,(或 -1,常见约定为 0)。每入队一个元素,rear向后移动一位;每出队一个元素,front向后移动一位。队列是程序设计中不可或缺的基础构件。本文从物理内存的堆栈概念切入,介绍了顺序队列的假溢出问题及其循环队列的解决方案,并给出了完整的 C 语言代码。同时,我们也分析了链式队列的实现原理和适用场景。

2026-06-13 11:05:40 478

原创 数据结构学习之路(三)----栈的两种实现方式:顺序栈与链式栈

对比项顺序栈(数组栈)链式栈(链表栈)底层结构连续数组不连续节点 + 指针大小限制固定(需预先定义)动态(受堆内存限制)空间效率无额外指针开销每个元素多一个指针时间效率入栈/出栈 O(1),CPU 缓存友好入栈/出栈 O(1),但可能 cache miss是否容易溢出可能栈满(需自己判断)一般不会(除非内存耗尽)典型应用场景编译器的函数调用栈、括号匹配浏览器后退按钮、撤销操作(长度不可预期)栈这种看似简单的数据结构,却贯穿了整个计算机系统的底层到上层。

2026-06-12 18:13:02 408

原创 数据结构学习之路(二)----循环链表与双向循环链表

循环链表是单链表的一种变形:将最后一个结点的next指针从NULL改为指向头结点(或第一个结点),使整个链表形成一个环。结构示意(带头结点):双向链表prev(前驱)和next(后继)。将双向链表的头结点的prev指向尾结点,尾结点的next指向头结点,就构成了双向循环链表。这是实际工程中最常用的链表形态之一(如 Linux 内核链表)。结构示意:prev 与 next 形成完整闭环将上一章学习的顺序表与单向链表拿来做对比,我们可以清晰的看见时间复杂度操作顺序表单向链表。

2026-06-11 15:08:59 317

原创 数据结构学习之路——顺序表与单向链表

在正式学习两种结构前,我们先理清基础概念。早期编程使用机器语言,直接操作二进制和内存地址,存储、运算数据既低效又容易出错。于是高级语言引入数据类型,屏蔽了底层内存细节,还能校验运算合法性。在此基础上延伸出抽象数据类型(ADT):它是一个数学模型 + 一组配套操作,只定义数据范围和可执行行为,不限制具体实现。就像游戏角色马里奥,定义了前进、跳跃、射击等动作,至于代码如何实现并不关心。而线性结构除首尾元素外,每个元素仅有一个前驱、一个后继;第一个元素没有前驱;最后一个元素没有后继。

2026-06-10 18:47:41 528 1

空空如也

空空如也

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

TA关注的人

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