- 博客(28)
- 收藏
- 关注
原创 二叉树遍历代码
3.后序遍历(Post-order)2.中序遍历(In-order)从上到下、从左到右逐层访问,需借助队列。层序遍历(Level-order。前序遍历(Pre-order)
2025-08-07 13:02:39
157
原创 由两种遍历序列构造唯一二叉树
由两种遍历序列构造唯一二叉树,需要满足以下条件之一:前序 + 中序序列后序 + 中序序列层序 + 中序序列(注意:前序+后序无法唯一确定二叉树,除非树中没有度为1的节点,即所有节点要么度为0,要么度为2。中序序列的作用是区分左右子树,而前序/后序/层序的作用是确定根节点。前序的第一个元素是根节点。在中序序列中找到根节点的位置,左侧是左子树,右侧是右子树。递归构建左子树和右子树。根节点是3(前序第一个)。在中序中,3的左侧[9]是左子树,右侧[15,20,7]是右子树。递归:左子树的前序是。
2025-08-05 09:42:09
370
原创 树的基本性质及种类
②n₁ = 0或1 若有2k个结点,n₁ = 1,n₀ = k,n₂ = k - 1;完全二叉树 ①只有最后两层可能有叶子结点 ②最多有1个度为1的结点 ③i ≤ ⌊n/2⌋为分支结点,i > ⌊n/2⌋为叶子结点(必须先把左边填满)①度为0、1、2个数n₀、n₁、n₂ 则n₀ = n₂ + 1 ②第i层至多2ⁱ⁻¹个结点。高度为h的m叉树至多(mʰ⁺¹ - 1)/(m - 1)个结点,至少h个结点。度为m的树第i层至多mⁱ⁻¹个结点 m叉树至多mⁱ⁻¹个结点。③高度为h至多有2ʰ - 1个结点。
2025-08-04 09:34:20
343
原创 循环队列的实现
循环队列是一种利用数组 + 取模运算实现的先进先出数据结构。它通过逻辑上的循环使用数组空间,避免了普通队列的“假溢出”问题。下面是一个完整的 C 语言实现,包含初始化、入队、出队、判空、判满、获取长度等基本操作。
2025-08-01 10:15:23
202
原创 KMP算法的优化
KMP算法本身已经通过避免回溯主串指针和利用部分匹配表(next数组)将暴力匹配从O(m×n)优化到O(m+n),但在实际应用中仍有多种优化空间。
2025-07-31 08:45:40
216
原创 稀疏矩阵的十字链表法存储
稀疏矩阵的十字链表法存储是一种高效的存储方式,特别适用于非零元素分布不规则且频繁进行插入/删除操作的场景。它通过行链表+列链表的十字交叉结构,将非零元素节点同时挂在所在行和所在列的链表中,从而兼顾行和列的访问效率。
2025-07-29 08:20:54
375
原创 静态链表的定义与实现
静态链表是一种使用数组实现的链表结构,它通过游标(cursor)来模拟指针的功能。与动态链表使用指针不同,静态链表使用数组下标作为"指针"来指向下一个元素。
2025-07-24 09:16:40
116
原创 共享栈的定义及应用
共享栈(Shared Stack)是一种特殊的栈结构,它将两个栈的栈底分别设置在共享存储空间的两端,两个栈的栈顶则向中间延伸。判满条件:top1 + 1 == top2(假设栈1从低地址向高地址增长,栈2从高地址向低地址增长)。// 栈2的栈顶指针(初始为MAX_SIZE)内存受限系统:在嵌入式系统或单片机中,两个栈空间需求动态变化时(如中断栈与任务栈共享内存)。// 栈1的栈顶指针(初始为-1)// 入栈(stackId=1表示操作栈1,stackId=2表示操作栈2)s->top1 = -1;
2025-07-23 10:10:36
409
原创 栈的一些应用和队列的一些应用
图的广度优先遍历:从某个结点入队开始,将它周围相邻的结点(未入过队)入队,自己出队,直到周围无符合条件结点入队,直接出队。树的层次遍历:从根结点开始,每查找到一个结点,就将它的子结点入队,将自身出队(根先入队,若无子结点直接出队即可)最终验证:遍历完所有字符后,若栈为空,则所有括号正确匹配;否则存在未匹配的括号。遇到右括号(如 ), ], }):从栈顶弹出元素,检查是否与当前右括号匹配。在操作系统应用:FCFS(先来先服务)应用于多个进程争抢资源。遇到左括号(如 (, [, {):压入栈(标记为待匹配)。
2025-07-22 09:35:33
166
原创 表达式求值计算的栈算法
扫描到操作数压入操作数栈,扫描到运算符或界限符,按“中转后”逻辑压入运算符栈(期间会弹出运算符,每弹出一个就要弹出2个操作数栈元素执行相应运算,结果压回操作数栈)。- 遇到运算符,依次弹出栈中优先级高于或等于当前运算符的所有运算符并加入后缀表达式,碰到“(”或栈空则停止,之后再把当前运算符入栈。- 遇到界限符,“(”直接入栈,遇到“)”则依次弹出栈内运算符加入后缀表达式,直到弹出“(”且(不加入后缀表达式)。③若为运算符,则弹出栈顶2个元素,执行运算,结果压回栈顶,回到①(先出栈为后操作数)。
2025-07-21 08:52:25
181
原创 部分线性表及其定义说明
线性表是数据结构中最基础、最常用的逻辑结构之一,其特点是数据元素之间呈线性关系(即“一对一”关系)。:尾节点的指针指向头节点(单循环链表)或头节点的前驱指向尾节点(双循环链表)。:一种操作受限的线性表,仅允许在栈顶进行插入(push)和删除(pop)。插入/删除只需修改指针(时间复杂度O(1)找到位置后)。:用数组模拟链表,通过**游标(数组下标)**代替指针。:每个节点包含数据域和一个指针域(指向后继节点)。支持双向遍历,插入/删除更灵活(需修改两个指针)。可用数组(顺序栈)或链表(链栈)实现。
2025-07-18 09:35:58
280
原创 n个元素不同进栈出栈的顺序种数的部分推导过程
卡特兰数(Catalan Numbers)是一系列自然数,出现在许多组合数学问题中。其定义之一如下:第n个卡特兰数 Cₙ 可以表示为:/ (n!*n!
2025-07-16 09:45:44
925
原创 数据结构基本要素及顺序表与链表的比较
数据的运算:对数据施加的操作,运算的定义是针对数据的逻辑结构的,指出运算的功能;数据的逻辑结构:数据元素之间的逻辑关系,是从具体问题抽象出来的数学模型,与数据的存储无关,分为线性结构和非线性结构。数据的存储结构:数据的逻辑结构在计算机中的存储表示,也叫物理结构。顺序表:优点:支持随机存取,存储密度高 缺点:大片连续空间分配不方便,改变容量不方便。创:顺序表:需预分配大片连续空间,分为静态分配与动态分配,链表:只需分配一个头结点。增、删:顺序表:插/删要将后续元素后/前移,T(n)=O(n)(移动元素)
2025-07-15 09:58:39
187
原创 关于时间复杂度和空间复杂度的解释
/ 循环 n-2 次。翻一张牌,看是大了还是小了,然后扔掉一半,继续找剩下的一半。空间复杂度:做菜用了多少“案板+锅碗瓢盆”(只看同时占用的最大空间如何随材料数量增长)。时间复杂度:做菜用了多少“步骤”(只看步骤如何随材料数量增长,不看具体几分钟)。记法:常用大 O(Big-O)表示,只保留增长最快的部分,并忽略常数。空间复杂度:只多用了 2 个整型变量(s、i),不随 n 变大 →。// 在升序数组 a 中查找 key,找到返回下标,找不到返回 -1。
2025-07-14 14:51:28
423
原创 HashMap和Hashtable的区别
1)HashMap使用无参构造时会设置加载因子为0.75,entry数组为空,Hashtable使用无参构造时会设置加载因子为0.75,且底层会创建长度为11的entry数组。HashMap是在第一次插入元素的时候将数组扩容为16,之后每次扩容为原来的2倍,而Hashtable创建对象时数组的长度设置为11,每次扩容为为原来的2倍+1。6、HashMap中数组容量的大小要求是2的n次方,如果初始化时不符合要求会进行调整,必须为2的n次方,而Hashtable中数组容量的大小可以为任意正整数。
2025-05-25 14:15:27
582
原创 ArrayList几个源码的翻译注释
/将当前数据从index+1位置开始的numMove个元素,整体向前移动一位。// 遍历争个elementData数组,直到找到null或整个数组没有null为止。// 将当前数据从index+1位置开始的numMove个元素,整体向前移动一位。// 遍历争个elementData数组,直到找到目标值或整个数组没有目标值为止。// 如果新容量小于所需容量,更新新容量值为minCapacity。// 获取默认容量和最小容量较大的那个 默认容量为10。// 获取被修改旧值。// 获取移动元素个数。
2025-05-05 11:40:14
699
原创 找出星型图的中心节点
有一个无向的图,由n个编号从1到n的节点组成。星型图有一个节点,并且恰有n - 1条边将中心节点与其他每个节点连接起来。给你一个二维整数数组edges,其中表示在节点ui和vi之间存在一条边。请你找出并返回edges所表示星型图的中心节点。2如上图所示,节点 2 与其他每个节点都相连,所以节点 2 是中心节点。1edges。
2025-04-04 19:22:31
427
原创 多数问题的哈希表求解
在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。最简单的暴力方法是,枚举数组中的每个元素,再遍历一遍数组统计其出现次数。该方法的时间复杂度是 O(n 2 ),会超出时间限制,因此我们需要找出时间复杂度小于 O(n 2 ) 的优秀做法。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。你可以假设数组是非空的,并且给定的数组总是存在多数元素。,返回其中的多数元素。
2025-03-16 13:52:48
401
原创 关于队列和贪心算法的一个投票经典问题
参议院由来自两派的参议员组成。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的。以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。所有失去权利的参议员将在过程中被跳过。假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并决定改变。参议员可以使用他的第一项权利禁止第一个参议员的权利。参议员可以使用第一项权利禁止第二个参议员的权利。参议员会将被跳过,因为他的权利被禁止了。个参议员,给定字符串的大小将是。代表每个参议员的阵营。
2025-02-09 09:41:49
365
原创 Huffman编码实现压缩和解压缩软件
相信读者在平常的生活中经常使用压缩软件对文件进行压缩,以更小但完备的姿态去面对令人焦灼的网速。如果在一棵树中加入任意的一条边,就会得到有且只有一个环的图。如果要在树中加入一个点,就要加入一条这个点和原有的点相连的边。队,先去排队的就先结账出去,排在后面的就后结账,有其他人再要过来结账,必须排在队。队列是一种常见的数据结构,是人为设计的,因为设计的时候给其加了一些数据使用的限。说,在编码中的每个码字,都不能被其他码字当成前置部位。实现霍夫曼树的方式有很多种,我们这里只需要使用两个队列来实现树的构建,
2025-01-24 15:08:07
934
原创 链表查询等分位点的快慢指针法
对于一个链表,我们如果需要查询它的某一个等分位点,如正中间的节点(偶数个即取偏左的节点),三等分位点等节点,最先映入脑海的必定是暴力法求解,此时先遍历链表,获取链表长度,然后再利用循环相应次数找到对应节点,但这种方法虽然直观,但总感觉进行了两次类似重复的循环,让人感到有点冗长,那么是否可以进行优化呢?以找到中间节点为例,设置两个指针,一个步长为2,一个步长为1,当快指针走到指针末尾时,慢指针走到了链表正中央,即找到了节点。下面给出了快慢指针法找到链表中间节点的Java程序,读者可随意取用。
2025-01-24 14:53:07
446
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅