数据结构相关内容
文章平均质量分 54
既包含一些知识点总结,也包含一些刷题总结~
guai_guai_guai
这个作者很懒,什么都没留下…
展开
-
二叉树的最大深度
可以将递归得到的值存起来会大大提高效率。是指从根节点到最远叶子节点的最长路径上的节点数。原创 2023-12-13 00:00:00 · 364 阅读 · 0 评论 -
用队列实现栈
请你仅用那个两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop和empty)。原创 2023-12-09 00:00:00 · 399 阅读 · 0 评论 -
有效的括号
给定一个只包括‘[’,‘]’,‘{’,‘}’,‘(’,‘)’的字符串s,判断字符串是否有效。有效字符串需满足:1. 左括号必须用相同类型的右括号闭合。2. 左括号必须以正确的顺序闭合。输入:s=“()”输出:ture输入:s=“()[]{}”输出:true输入:s=“([”输出:false输入:s=“([)]”输出:false。原创 2023-12-08 00:00:00 · 394 阅读 · 0 评论 -
二叉树的前序遍历
给你二叉树的根节点root,返回节点值的前序遍历。原创 2023-12-12 08:00:00 · 416 阅读 · 0 评论 -
数据结构:数和二叉树
结点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的度为6叶节点或终端节点:度为0的节点称为叶节点;如上图B、C、H、I···等节点为叶节点非终端节点或分支节点:度不为0的节点;如上图:D、E、F、G····等节点为分支节点双亲结点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点兄弟节点:具有相同父节点的节点互称为兄弟节点;如上图B、C是兄弟节点树的度:一棵树中,最大的节点的度称为树的度;如上图:树的度为6。原创 2023-12-10 11:45:29 · 856 阅读 · 0 评论 -
线性表之-栈
栈:一种特殊的线性表,其只允许操作。进行数据插入和删除操作的一端称为,另一端称为栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈,原创 2023-12-06 00:00:00 · 415 阅读 · 0 评论 -
平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。原创 2023-12-14 00:00:00 · 357 阅读 · 0 评论 -
清华大学考研复试上机题之二叉树的遍历
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:ABC##DE#G##F###其中表示的是空格空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果输入:abc##de#g##f###输出:c b e g d f a。原创 2023-12-15 00:00:00 · 428 阅读 · 0 评论 -
线性表之-队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有FIFO(First in First Out)的特点入队列:进行插入操作的一端称为出队列:进行删除操作的一端称为。原创 2023-12-07 00:00:00 · 371 阅读 · 0 评论 -
快速排序(非递归)以及归并排序的递归与非递归
递归次数太多的缺陷:极端情况下(栈帧深度太深)会导致栈溢出,即使程序代码正确(递归的深度足够深时,空间不足,就会导致栈溢出),因此在实际应用中通常情况下是利用非递归算法实现。递归改成非递归:1.直接改循环(简单)2.借助数据结构栈模拟递归过程(复杂)首先要建立一个栈,直接引用之前建立过的栈即可,用栈来模拟左右递归的过程,由于栈是先进的后出,为了先排左边的,就得先将被分割后的右边下标存入栈中,当左边的下标被提取完之后,说明左边已经有序,接着取出右边的下标进行单趟排序即可。以此类推:Stack.h。原创 2023-12-21 20:21:54 · 892 阅读 · 0 评论 -
数据结构:直接选择排序和堆排序
这里我用两个变量同时找出最小值和最大值。注意:若begin为最大值,maxi即为最大值的下标,若将最小值与其交换,最大值的下标此时就不再是maxi,而变为mini了,故此时要调整maxi的位置。原创 2023-12-18 00:00:00 · 391 阅读 · 0 评论 -
计数排序,基数排序及排序总结
在这里我在说说计数排序吧,计数排序就是将给定数组中的数进行计数,在从小到大依次输出即可。稳定性:当要排序的数组有相同数据时,排序后相同数据的相对位置不变,则称该排序算法稳定,否则即为不稳定.思想:分别取出每个数的个位,十位,百位······,每次依次通过个位。十位、百位···对其进行排序。计数排序的时间复杂度:O(N+range),它适用于范围集中的整型数组。平时这个排序用处不大,在此就不展示它的代码了。原创 2023-12-23 13:18:04 · 427 阅读 · 1 评论 -
冒泡排序和快速排序(分治递归算法)
冒泡排序时间复杂度为O(N^2)直接插入排序比冒泡排序适应性更好,数据接近有序时比直接选择排序更好。原创 2023-12-19 20:31:38 · 439 阅读 · 1 评论 -
二叉树的层序遍历
先用二叉树结构体front记录队列的front,之后取出二叉树front,并输出,如果二叉树front的左子树不为空,就将front的左子树插入到队列中,右子树同理,之后又将front替换到新队列的front元素,再移出输出,直到队列为空就停止。如果对上图的二叉树进行深度优先遍历的前序,则最终输出结果为A B D E C F G.而广度优先遍历输出结果为A B C D E F G.要想实现广度优先遍历,在这里我们可以使用队列来实现,不通过递归实现遍历。二叉树的前序,中序和后序遍历其实就是深度优先遍历。原创 2023-12-11 00:00:00 · 377 阅读 · 0 评论 -
插入排序:直接插入排序 希尔排序
假设红竖线前的元素全部排好序,红线后面的数即为要插入的数据,红线依次往后移,假设end为排好序的最后一个数字,end+1即为要插入的数字,一次插入时,end与要插入的数字依次比较,之后end--,直到end小于0后循环停止,进入下一次的插入数据,故让end等于for循环里的i即可,一次插入之后end就向后移一位,循环次数为n-2(若为n-1,end+1就会越界)。原创 2023-12-17 00:00:00 · 441 阅读 · 0 评论 -
简单总结顺序表和链表的区别和联系
空间连续,支持随机访问。原创 2023-12-05 00:00:00 · 373 阅读 · 0 评论 -
C语言实现学生成绩管理系统(单链表)
本次我就用学到的相关链表知识总结回顾一下。首先还是先创建一个项目,分别创建头文件和源文件,头文件用来声明函数,源文件用来定义函数以及实现学生成绩管理系统。创建完成后如上图。先创建一个结构体用来存放学生信息(学号,姓名,成绩),在这里学号我使用的是字符数组,整型可能不能满足学号长度的需要。接着就是创建节点用来链接学生信息喽!节点如下:常规的放一个结构体(学生信息)以及下一个结点的地址。基本步骤就完成了。接下来是菜单,用来指引用户完成程序。菜单就用函数来实现(记得先在头文件里声明)。原创 2024-01-15 13:34:43 · 1562 阅读 · 0 评论 -
数据结构:带头双向循环链表的实现
图示方框为头节点,不添加任何有效数据,头节点的前驱指向3的位置,3的后驱指向头节点,图示就是带头双向循环链表了。遍历链表直到遍历至头节点,若找到要找的值,就返回该地址,遍历完还没有找到就返回NULL。之前说的链表里最后一个节点指向空指针,循环链表里最后一个结点指向第一个结点的地址。遍历整个链表,注意在释放节点时,要先记录下一个节点,遍历完之后,释放头节点。记录删除结点位置的前一个节点位置以及后一个节点的位置。,第二个节点的prev指向头节点即可完成头删。前一个节点的next指向后一个节点,原创 2023-12-02 08:00:00 · 964 阅读 · 0 评论 -
寻找链表的中间节点
给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间节点,则返回第二个中间结点,个数为奇数返回一个值,个数为偶数返回两个中间结点的第二个值。定义一个slow和fast结构体指针,slow每次走一步,而fast每次走两步,当fast的next为空或fast为空时,结束循环,最终slow即为中间结点。用快慢指针来寻找中间结点。原创 2023-12-02 08:45:00 · 390 阅读 · 0 评论 -
环形链表 2:找出入环的第一个节点
给定一个链表返回链表开始入环的第一个点。如果链表无环,则返回NULL。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。不允许修改给定的链表。做此题之前,我们先来推理一个结论,结论:一个指针从meet(slow和fast相遇的地方)开始走 ,一个指针从链表头开始走,它们会在入口点相遇。原创 2023-12-04 14:40:28 · 405 阅读 · 0 评论 -
反转链表的实现
定义三个结构体指针n1,n2,n3,n1表示改后指针的地址,n2表示要修改结构体里next的节点,n3用来存储下一个节点,如果没有n3,修改n2的next之后,就找不到下一个节点了,迭代就不能实现。注意:要记录头插到新链表的下一个节点next,同时记录当时插入的节点newhead。n3为空时就不能指向下一个节点,会非法访问地址,因此还要判断n3是否为空。将每个节点里的地址由指向下一个节点变为指向前一个节点。注意:链表可能为空链表,要讨论链表为空链表的情况。给出一个链表的头节点,将其反转,并返回新的头节点。原创 2023-12-02 08:15:00 · 359 阅读 · 0 评论 -
合并两个有序链表
问题描述:将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有结点组成的。(不能创建一个新的链表)原创 2023-12-03 00:00:00 · 353 阅读 · 0 评论 -
判断是否有环形链表
给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回true,否则,返回false。原创 2023-12-03 00:00:00 · 409 阅读 · 0 评论 -
C语言:刷题2:合并有序数组
我们用end1表示nums1数组的下标,用end2表示nums2的下标,end表示两个数组合并之后的下标,如果从前往后比较替换,那么被覆盖的元素(nums1或num2),就不会再出现,所以为了避免被覆盖,应从后往前开始比较替换。这里还要注意一个问题,当end1等于0之后跳出循环,nums2中的元素还要放到nums1中,如果end2先到0,此时不用处理,因为nums1的元素本来就在该数组中。给你两个有序整数数组nums1和nums2,请你将nums2合并到num1中,时num1成为一个有序数组。原创 2023-11-29 13:00:00 · 393 阅读 · 1 评论 -
C语言:单链表的简单实现
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。原创 2023-12-01 08:00:00 · 391 阅读 · 0 评论 -
C语言:刷题1:移除元素
本题用函数解决:本题对于空间复杂度和时间复杂度均有要求,这里我们考虑用双指针实现,用str代表遍历数组的下标,dst表示去除元素后新的数组的下标,当str指向的不是要删去的元素时,将str指向的元素赋给dst(相当于对数组存放新的数据),str++,des++,当str指向要删去的元素时,str++,dst不变,最终留下的即为删去指定数字之后的数字。给你一个数组nums和一个值,你需要原地移出所有数值等于val的元素,并返回移除后数组的新长度。原创 2023-11-29 12:00:00 · 410 阅读 · 1 评论 -
C语言:顺序表的简单实现
创建头文件用于声明函数,创建两个源文件(test.c和Seqlist.c),一个用来定义函数,一个用来测试。今天我们试着创建一个顺序表,并实现对顺序表的增删查改。原创 2023-11-29 14:00:00 · 397 阅读 · 1 评论