
数据结构代码题
文章平均质量分 85
ChoSeitaku
是一名在校大学生,目前在做C语言、C++、蓝桥杯、算法、考研数学、408的内容,后期会做深度学习、机器学习、神经网络、人工智能、AIGC、WEB3、开发相关的内容
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉树序列相关算法题|先序序列第k节点|满二叉树先序序列转后序序列(C)
但对满二叉树,任意一个节点的左右子树均含有相等的节点数,同时,先序序列的第一个节点作为后序序列的最后一个节点,由此得到将先序序列。假设二叉树采用二叉链存储结构存储,设计一个算法,求先序遍历序列中第k(1原创 2024-12-12 23:22:44 · 1035 阅读 · 0 评论 -
二叉树交换相关算法题|递归/非递归交换所有节点左右子树(C)
采用递归算法实现交换二叉树的左右子树,首先交换root节点左孩子的左右子树,然后交换root节点右孩子的左右子树,最后交换root节点的左右孩子,当节点为空时递归结束(后序遍历思想)设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有节点的左右子树进行交换的函数。原创 2024-12-11 10:25:55 · 237 阅读 · 0 评论 -
二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)
使用深度优先搜索计算二叉树的层平均值,需要维护两个数组,counts数组用于存储二叉树的每一层的节点数,sums用于存储二叉树的每一层的节点值之和。搜索过程中需要记录当前节点所在层,如果访问到的节点在第i层,则将counts的i的值+1,并将该节点值加到sums的i。假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支节点个数。给定一个非空二叉树的根节点root,以数组的形式返回每一层节点的平均值。遍历结束之后,第i层的平均值即为sums的i除以counts的i。原创 2024-12-10 23:11:56 · 838 阅读 · 0 评论 -
二叉树祖先相关算法题|单节点所有祖先|最近公共祖先(C)
设一棵二叉树的结点结构为(LLINK,INFO,RLINK),ROOT为指向该二叉树根结点的指针,P和分别为指向该二叉树中任意两个结点的指针,试编写算法ANCESTOR(ROOT,P,a,r),找到p和q的最近公共祖先结点r。采用后序非递归算法,栈中存放二叉树节点的指针,当访问到某节点时,栈中所有元素均为该节点的祖先。先将栈复制到另一个辅助栈中。采用非递归后序遍历,最后访问根节点,访问到值为x的节点时,栈中所有元素均为该节点的祖先,依次出栈打印即可。将5入栈,找到值为x的节点,从栈底开始输出栈内的元素。原创 2024-12-10 14:24:54 · 749 阅读 · 0 评论 -
完全/满二叉树相关算法题|判断是否为完全/满二叉树(C)
如果一棵二叉树的所有层都被完全填满,除了最后一层(叶子层),并且最后一层的所有节点都尽可能地靠左,那么它就是完全二叉树。采用层次遍历算法,将所有节点加入队列(包括空节点),遇到空节点时,查看其后是否有非空节点。如果当前节点没有孩子或者开始出现子节点为空的情况,则后续所有节点必须为叶子节点,否则返回 false。根据完全二叉树的定义,具有n个节点的完全二叉树与满二叉树中编号从1~n的节点一一对应。一棵二叉树中,每个节点要么没有子节点,要么有两个子节点,并且所有叶子节点都在同一层。判断一棵树是否是满二叉树。原创 2024-12-09 22:12:51 · 406 阅读 · 0 评论 -
二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)
先遍历5,d是0,不是叶子节点,递归3和7,d为1,3不是叶子节点,7是叶子节点,返回1x7,再递归1和4,d为2,都是叶子节点,返回1x2和4x2,所以WPL为2+8+7=17。二叉树的WPL值 = 树中全部叶节点的带权路径长度之和 = 根节点左子树中全部叶节点的带权路径长度之和 + 根节点右子树中全部叶节点的带权路径长度之和。深度优先遍历二叉树,要考虑当前节点以及它的孩子节点,如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。原创 2024-11-21 15:20:18 · 1959 阅读 · 0 评论 -
二叉树宽度高度相关算法题|非递归求二叉树高度|求非空二叉树宽度(C)
采用层次遍历的算法,设置遍历level记录当前节点所在的层数,设置变量last指向当前层的最右节点,每次层次遍历出队时与last指针比较,若两者相等,则层数+1,并让last指向下一层的最右节点,直到遍历完成。当前front是0,last也是0,front指向的是上一层的最右节点A,last初始化为0,也就是指向A,表示是最右节点,lv初始化为1,也就是查找第一层的节点,也就是level数组,如果level的i下标的值等于level表示有一个节点,n++把左右孩子读进去,把节点和层次也存到相应位置,原创 2024-11-19 14:25:34 · 643 阅读 · 0 评论 -
二叉树遍历相关算法题|后序遍历非递归|下到上左到右层次遍历|先序遍历非递归(C)
因为后序是要左右中的顺序遍历,现在读取栈顶的D,是后序遍历的第一个节点,已经确保D没有左孩子,再看D有没有右孩子,因为D没有右孩子,D出栈,并访问D节点的数据,这表示以D为根节点的子树已经遍历完毕。由于cur指向NULL,再走else逻辑,读取栈顶元素B,由于B有右孩子但是已经被访问过,直接弹出B,访问B的数据,将r指向B,cur指向NULL。cur每次指向cur的left来遍历,如果cur不为空,全部入栈,A,B,D,直到cur指向D的左孩子是NULL。将E弹出,访问E的数据,将r指向E,将cur置空。原创 2024-11-18 16:28:13 · 1133 阅读 · 0 评论 -
栈队列相关算法题|整理字符串|字符串去重|循环队列入队出队|队列通过栈逆置|栈模拟队列|循环链队入队和出队|循环队列队尾删除和队头插入(C)
因为存入S1栈后,再取出是逆序,所以需要先将S1栈中的数据逐个取出,入S2栈,再在S2执行出栈操作,实现出队,出队时需要判断S2栈是否为空。2. 出队时,需要判断队是否为空,如果只剩一个rear节点,rear的next指向rear自己,则队列为空,直接返回程序。假如MaxSize是5,整个数组是0-4,rear是4,+1是5,%一个5,结果是0,返回到第一个位置。通过栈将队列里的元素逆置,让队列中的元素逐个出队,然后入栈,再逐个出栈,入队,完成逆置。原创 2024-11-17 10:38:44 · 680 阅读 · 0 评论 -
栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)
在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若相等,则将链表中的下一个元素与栈中再弹出的元素进行比较,直至链表尾。设有两个栈S1和S2都采用顺序栈的方式,并共享一个存储区,0-maxsize-1,为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。使用栈,当为左括号时,入栈,右括号时,若栈顶是其对应的左括号,则出栈,若不是其对应的左括号,则结论为括号不配对,当表达式结束,若栈为空,则结论表达式括号配对,否则,结论表达式括号不配对。原创 2024-11-15 22:58:17 · 599 阅读 · 0 评论 -
链表相关其他算法题2|排序插入节点|按数据类型拆分链表|输出次数最多的前k个词|三个链表公共元素|两个整数数位求和(C)
设民航公司有一个自动预订飞机票的系统,该系统中有一张用双重链表示的乘客表,表中节点按乘客姓氏的字母序相连为该系统写一个当任意乘客订票时修改乘客表的算法av是可用数组空间的最小下标按数据类型拆分链表已知L为没有头节点的单链表中第一个节点的指针,每个节点数据域存放一个字符,该字符可能是英文字母字符或数字字符或其他字符构造三个以带头节点的单循环链表表示的线性表,是每个表中只含有同一类字符首先要构造含有这三类字符的表头节点然后从原链表的第一个节点开始,根据数据域的类型分别插入到三个链表之一采用前插法输原创 2024-11-15 10:32:34 · 480 阅读 · 0 评论 -
链表相关其他算法题1|按访问频度排序|求链表的最大孪生和|后半段原地逆置|找链表中间节点(C)
设置快慢指针fast和slow,初始时slow指向L,fast指向L的next,slow每次走一步,fast每次走两步,当fast指向表尾时,slow正好指向链表的中间节点,第n/2个节点,即slow刚好指向链表前半部分的最后一个节点,将链表的后半部分逆置,然后设置两个指针分别指向链表前半部分和后半部分的首节点,在遍历过程中计算两个指针所指节点元素之和,并维护最大值。求这个链表的最大孪生和,定义为一个节点值与其孪生节点值之和,对于第i个节点,其孪生节点为第n-i-1个节点。原创 2024-11-14 21:06:16 · 909 阅读 · 0 评论 -
链表排序相关算法题|删除节点输出有序结果|不带头节点单链表排序|带头节点单链表排序|单链表快排(C)
再查找最小值元素,输出并释放节点,如此下去直到链表为空,最后释放头节点所占的存储空间。用prev指针遍历,直到prev的next指向NULL,或者prev的next的值大于等于cur的值。首先假定第一个节点有序,然后从第二个节点开始,依次插入到前面有序链表当中,最终达到整个链表有序。单链表带头节点,要求用直接插入排序原则,从第二个节点开始,将各节点依次插入到有序链表中。按递增次序输出单链表中的各节点的数据元素,并释放节点所占的存储空间。需要遍历有序链表,查找有序链表中小于cur的值的最后一个节点。原创 2024-11-12 23:18:01 · 318 阅读 · 1 评论 -
链表与交换相关算法题|数值与后继节点交换|两两交换节点|交换当前节点与后继节点(C)
令head的next=swapPairs(newHead),表示将其余节点进行两两互换,交换后的新的头节点为head的下一个节点,然后令newHead的next指向head,完成了所有的两两互换。用head表示原始链表的头节点,新的链表的第二个节点,用newHead表示新链表的头节点,原始链表的第二个节点,则原始链表中其余节点的头节点是newHead->next。如果链表中至少有两个节点,则在两两交换节点之后,原始链表的头节点变成新链表的第二个节点,原始链表的第二个节点变成新链表的头节点。原创 2024-11-12 19:50:40 · 656 阅读 · 0 评论 -
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
已知递增有序的单链表A,B分别存储了一个集合,请设计算法以求出两个集合A和B的差集,A-B,并以同样的方式存储,同时返回该集合的元素个数。在A中删除A和B中共有的元素,由于是单链表,删除节点要记住被删除节点的前驱,两个链表都开始遍历,直到一个链表遍历结束。应该先将第一节点从链表上摘下来,再将其插入到链表中相应的位置,由于是双向链表,不必像单链表那样插入节点的前驱。假设一个单循环链表,其节点含有三个域,prev,data,next,prev为空指针,next指向后继节点。原创 2024-11-11 15:38:40 · 493 阅读 · 0 评论 -
链表归并与并集相关算法题|两递增归并为递减到原位|b表归并到a表|两递减归并到新链表(C)
设有两个无头节点的单链表,头指针分别为ha,hb,两链表的数据都按递增次序存放,现要求将hb表归并到ha表中,且归并后ha仍为递增,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。申请头节点la指向ha的头节点,cura和curb分别指向ha和hb的第一个节点,prev指针指向cura的前一个节点。因为两链表已按元素值递增次序排列,将其合并时,均从第一个节点起进行比较,将小的链入链表中,同时后移链表工作指针。hb表不能被破坏,即要归并的时候,要创建新节点。原创 2024-11-10 23:23:36 · 441 阅读 · 0 评论 -
链表拆分与快慢指针相关算法题|一拆分为二|判断链表是否带环|返回倒数第k个节点(C)
将fast指针指向链表的第k+1个节点,slow指向链表的第一个节点,此时fast和slow之间刚好相差k个节点,两个指针同步向后走,当fast走到链表的尾部空节点时,slow指针正好指向链表的倒数第k个节点。采用头插法将下一节点插入表B,这个节点为偶数号节点,这样建立的表B与原来的节点顺序正好相反。采用尾插法将一个节点插入表A,这个节点为奇数号节点,这样建立的表A与原来的节点顺序相同;单链表有环,是指单链表的最后一个节点的指针指向了链表中的某个节点,判断单链表是否存在环。原创 2024-11-06 23:04:11 · 885 阅读 · 0 评论 -
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
表A,B都有序,可从第一个元素起依次比较A、B两表的元素,若元素值不等,则值小的值往后移,若元素值相等,则创建一个值等于两节点的元素值的新节点,使用尾插法插入到新的链表中,并将两个原表指针后移一位,直到其中一个链表遍历到表尾。一个工作指针cura用来遍历链表A,一个工作指针curb用来遍历链表B,一个工作指针curc用来建立链表C,一个指针new用来创建共同节点的新节点尾插到C链表上。循环结束后,如果curb指向NULL,表示链表B的curb都等于对应的cura,链表B是链表A的连续子序列。原创 2024-11-04 23:11:51 · 1218 阅读 · 0 评论 -
链表逆置相关算法题|原地逆置|轮转链表|循环链表逆置(C)
将n初始化为1,cur指向L,cur的next指向第一个节点,往后遍历直到cur的next指向NULL,cur指向最后一个节点。一个工作指针cur用来遍历链表,一个后继指针用来保存cur的下一个节点,一个前驱指针prev用来保存前一个节点。然后找到新链表的尾节点,为原链表的第n-k个节点,令L指向新链表尾节点的下一个节点,并将环断开,得到新链表。将prev指向cur,cur指向next,next指向next的下一个,三个指针往后走一步。将cur的next指向perv,将中间节点的next指向前一个节点。原创 2024-11-03 15:24:53 · 859 阅读 · 0 评论 -
链表删除相关算法题|删除值为x的节点|删除最小值节点|删除值在区间内的节点|删除重复节点|删除绝对值相等的节点(C)
最后cur指向cur的next,继续向后遍历。如果cur的data在min和max之间,prev的next指向cur的next,删除cur指向的节点,cur指向prev的next。用next指针指向cur的下一个节点,如果next节点的值等于cur节点的值,删除next节点,否则cur继续往后遍历。一个是遍历链表的工作指针cur,一个是指向cur的上一个节点的指针prev,一个是用于指向要删除的节点的指针del。如果没有碰到值为x的节点,将prev指向cur,cur指向cur的next,两个指针往后遍历。原创 2024-11-02 13:46:39 · 815 阅读 · 0 评论 -
顺序表排序相关算法题|负数移到正数前面|奇数移到偶数前面|小于x的数移到大于x的数前面|快排思想(C)
中,以an作为参考元素,将该表分为左右两部分,左半部分的每个元素小于等于an,右半部分每个元素都大于an,an位于分界位置上,并把结果仍存放在。已知线性表按顺序存储,且每个元素都是整数均不相同,把所有奇数移到所有偶数前边。,每个元素都是整数,把所有值为负数的元素移到全部正数值元素前边。cur找负数,++prev,交换prev和cur的值。cur指向的是负数,与prev交换,prev++cur指向-4,与prev交换,prev++指向-1,与prev交换,prev++cur++,判断下一个元素。原创 2024-10-25 15:01:11 · 856 阅读 · 0 评论 -
顺序表查找相关算法题|查找x|查找交集|查找中位数|查找主元素|查找未出现的最小正整数(C)
线性表中的元素递增有序且按顺序存储于计算机内,要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,将其与后继元素位置相交换,若找不到,将其插入表中并使表中元素仍递增有序。再次扫描该数组,统计c中元素出现的次数,若大于n/2,则为主元素,否则,序列中不存在主元素。给定三个序列A,B,C,长度均为n,且均为无重复元素的递增序列,逐行输出同时存在于这三个序列当中的所有元素。已知一个整数序列A,长度为n,若存在m个数的值相等,且m>n/2,则称这个数是A的主元素,否则A没有主元素。原创 2024-10-25 13:40:06 · 765 阅读 · 0 评论 -
顺序表逆置相关的算法题|整体逆置|两个顺序表互换位置|轮转数组(C)
前半部分时,i从0到length/2-1闭区间,后半部分从length-1到length/2+1,也就是length-1-i。中的全部元素整体原地逆置,然后对前n个元素和后m个元素分别使用逆置算法,从而实现顺序表的位置互换。因为length是偶数,所以length/2指向的是前半部分的最后一个数据的下一个位置。后半部分是length-1开始到length/2,也就是length-1-i。当区间内的数据个数是偶数,mid指的是前半区间的最后一个数。当区间内的数据个数是奇数时,mid指的是正中间的数。原创 2024-10-21 22:26:16 · 1210 阅读 · 0 评论 -
顺序表删除相关的算法题|删除最小值|删除值为x的值|删除区间内的值|删除重复的元素(C)
因为k记录的是不等于x的值的元素个数,所以指向的是遍历过的不等于x的值的最后一个元素的下一个位置,所以之后遇到不等于x的元素直接前移到k的位置。用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),扫描时将不等于x的元素移动到下标k的位置,并更新k值。从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。用k记录顺序表L中等于x的元素个数,一边扫描L,一边统计k,并将不等于x的元素前移k个位置。原创 2024-10-13 21:59:57 · 888 阅读 · 0 评论