
数据结构入门65题
文章平均质量分 88
数据结构与算法入门65题,是指的PTA上的《数据结构与算法题目集(中文)》题目集,其中函数补全题12道,编程题53道,共65道。
本专栏会详细讲解这65道题,包括但不限于解题思路,一题多解等,并且对这些题目的不足之处(坑点)加以描述,最后给出C/C++语言的代码实现。
木又可可
我渴望力量!
展开
-
【编程题】7-5 堆中的路径
3. 根据所给下标,从下往上依次遍历输出堆中的元素,直到根结点,即堆中的路径,注意题目中的下标和自定义的堆中的下标。2. 按照题目要求,遍历所给数组,依次将元素加入。,分别是插入元素的个数、以及需要打印的路径条数。,这里不再赘述其原理和实现过程,只给出代码实现(应用)。个要被插入一个初始为空的小顶堆的整数。将一系列给定数字插入一个初始为空的最小堆。个结点到根结点的路径上的数据。,操作完之后即获得了一个最小堆;开始的,代码中的堆的下标是从。随后对任意给定的下标。个结点到根结点的路径。对输入中给出的每个下标。原创 2025-03-10 20:51:55 · 993 阅读 · 0 评论 -
【数据结构 C 语言实现】堆和优先队列
上面只是以最小堆作为例子,其它的情况可以此类推,并且数组下标从0开始,也可以将数组下标从1开始,这样做的唯一好处就是计算父亲和儿子的下标时的表达式更简洁一些,只需要选择一个自己喜欢的即可。关于优先队列的基本操作,这里省略了相对来说不太重要的基本操作(没有封装成函数),有兴趣可以自己封装一下。原创 2025-03-10 20:49:54 · 824 阅读 · 0 评论 -
【编程题】7-6 列出连通集
针对某个结点,我们除了要知道它是属于哪个连通块以外,还要能判断它是否已经被遍历过,然后从小编号的结点到大编号的结点依次遍历,如果当前结点已经被遍历过,则跳过,否则从这个结点开始进行。两种,在图的遍历中,一般选择后者存储,不过当图的结点比较少时,选择前者代码更简单。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。,很小,更重要的原因是题目要求结点按从小到大的顺序遍历,邻接表不好控制这个)。,此题的代码实现并没有使用单独的队列数据结构,而是怎么方便怎么来,具体见代码。原创 2025-03-10 20:49:03 · 1041 阅读 · 0 评论 -
【编程题】7-3 树的同构
判断二叉树的同构,其解决方法与判断二叉树是否相同类似,并且天然地可以使用递归的解法解决。关于树与二叉树的问题,如果可以用迭代解决的优先选择迭代,不过有时候迭代的思路并不好想,或者迭代的思路很复杂,那么使用递归解决就好。原创 2025-03-03 21:50:18 · 1112 阅读 · 0 评论 -
【编程题】7-4 是否同一棵二叉搜索树
常规思路就是,不管你是不是二叉搜索树,只要是二叉树(甚至只要是树),都可以直接使用一个算法来判断两棵树相不相同。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“上面的思路适用于任意二叉树,自然也适用于二叉搜索树。,分别是每个序列插入元素的个数和需要检查的序列个数。个以空格分隔的正整数,作为初始插入序列。原创 2025-03-03 21:49:11 · 920 阅读 · 0 评论 -
【编程题】7-1 最大子列和问题
这道题和纯粹的 “最大子数组和” 有细微的不同:这道题要求在数组全为负数的情况下返回000,所以会有特殊情况的处理。纯粹的 “最大子数组和” 问题可以参看这篇文章。原创 2025-02-23 16:52:59 · 1170 阅读 · 0 评论 -
【编程题】7-2 一元多项式的乘法与加法运算
注意细节的处理,特别是C语言中会涉及到空间的开辟和释放,空间的重复利用,内存泄漏等问题。原创 2025-02-23 16:52:21 · 943 阅读 · 0 评论 -
【数据结构入门 65 题】目录
6-1 单链表逆转6-2~6-6 线性表基本操作6-7 在一个数组中实现两个堆栈6-8 求二叉树高度6-9 二叉树的遍历6-10 二分查找6-11 先序输出叶结点6-12 二叉搜索树的操作集栈和队列原创 2025-02-16 22:09:43 · 225 阅读 · 0 评论 -
【函数题】6-10 二分查找
有一个非递减数组arr,长度为n,查找arr中最后一个小于等于X的元素下标,下标从0开始。易知,最后一个小于等于目标值的元素下标 = 第一个大于目标值的元素下标 - 1有一个非递减数组arr,长度为n,查找arr中最后一个小于X的元素下标,下标从0开始。易知,最后一个小于目标值的元素下标 = 第一个大于等于目标值的元素下标 - 1二分算法是一种思想,就像基本原理一样,原理很好懂,但是实现方法千变万化,喜好因人而异,上面所记录的都是一种闭区间的写法,即数组的左边界和右边界都是同时取得到的,另外还有。原创 2025-02-16 21:58:04 · 1202 阅读 · 0 评论 -
【函数题】6-12 二叉搜索树的操作集
实际上在删除二叉搜索树结点的时候可以有很多种操作的方法,比如可以取第一个前驱结点替代当前结点而不一定是第一个后继结点等,还可以在删除的时候调整二茶搜索树的某些结构。原创 2025-02-16 21:57:41 · 535 阅读 · 0 评论 -
【函数题】6-11 先序输出叶结点
此题只是在输出的时候注意判断一下是否为叶结点即可。下面只给出常规的递归解法和使用栈的迭代解法的代码实现,具体思路在博客。中详细记录了,此题只是在遍历的基础上加了简单的判断而已,故思路解析不再赘述。语言实现一个专用的栈,栈中存放二叉树结点指针,具体实现见。本题要求按照先序遍历的顺序输出给定二叉树的叶结点。的叶结点,格式为一个空格跟着一个字符。应按照先序遍历的顺序输出给定二叉树。二叉树的前序遍历,可以参考博客。基于回溯思想的前序遍历代码。使用栈的前序遍历代码。原创 2025-02-09 18:30:51 · 389 阅读 · 0 评论 -
【函数题】6-9 二叉树的遍历
二叉树的4种遍历有多种实现方式,这里简单记录了几种,其中,对于层序遍历,套路几乎是固定的,而对于前中后三种遍历,有递归迭代两类,由于递归总是有个“低效率”的标签,所以人们更倾向于迭代法,迭代法又有使用栈和不使用栈两种方法。实际使用时大多使用栈迭代,这种方法比较折中。原创 2025-02-09 18:28:11 · 1021 阅读 · 0 评论 -
【数据结构 C 语言实现】栈和(循环)队列
本文介绍了栈和队列的基本实现。栈部分包括结构体定义、创建栈、销毁栈、入栈、出栈、判断栈是否为空、获取栈顶元素及栈的大小等功能。栈通过动态数组实现,支持容量自动扩展。队列部分则实现了循环队列,包含结构体定义、创建队列、销毁队列、入队和出队等功能。循环队列通过动态数组实现,并在队列满时进行容量扩展。代码示例展示了栈和队列的核心操作,并提供了基本的功能实现。原创 2025-02-09 16:59:17 · 1033 阅读 · 0 评论 -
【函数题】6-7 在一个数组中实现两个堆栈
如果你碰巧是这样想的,那么通过测评没有问题,还有一种普遍的想法是把top1初始化为0,把top2初始化为,判满条件是。实际上这种思路完全没有问题,并且可行,不过在本题中不可行,会显示内存超限,估计是PrintStack函数的内部实现与top1和top2有关联吧。另外这道题的测试用例要在最后一行end之后再加个换行,不然就是超时。。。原创 2025-01-25 09:54:00 · 106 阅读 · 0 评论 -
【函数题】6-8 求二叉树高度
方法时间复杂度空间复杂度特点递归法OnO(n)OnOhO(h)Oh代码简洁,适合理解递归思想BFS法OnO(n)OnOwO(w)Ow层次遍历,适合宽度较大的树DFS法OnO(n)OnOhO(h)Oh深度优先遍历,适合高度较大的树根据需求选择合适的方法即可。递归法是最常用的方法,代码简洁且易于理解。思考:既然DFS一般用递归实现,那么这里的DFS应该怎么用递归实现呢?原创 2025-01-25 09:53:37 · 220 阅读 · 0 评论 -
【函数题】6-1 单链表逆转
本题是一道很经典的入门题,虽然简单,但是有些细节需要弄清楚之后才能理解透彻。比如使用迭代法反转时,指针的变换顺序,谁先指向谁,怎么形成循环等,以及递归法中如何递归,出口是什么,递归的不变逻辑是什么等。解决问题并不是重点,现在网上一搜一大把的题解和代码,重点是思路的形成和构建过程:为什么这样想,代码为什么这样写。本题既可以看作是一道单链表的题,又可以看做是一道训练递归思维的题,相信这篇文章能带给读者一些启发。原创 2025-01-24 12:35:59 · 301 阅读 · 0 评论 -
【函数题】6-2~6-6 线性表基本操作
直接从第一个结点开始顺序遍历链表即可,同时对结点个数进行统计,如果当前结点个数等于。直接从第一个结点开始顺序遍历链表即可,同时对结点个数进行统计。按照题目描述模拟即可,和【6-5 链式表操作集】极为相似。个元素,则返回该元素值。本题要求实现一个函数,找到并返回链式表的第。指向的结点之前,返回链表的表头。本题要求实现一个函数,求链式表的表长。的元素删除并返回链表的表头。本题要求实现带头结点的链式表操作集。本题要求实现顺序表的操作集。:创建并返回一个空的线性表;本题要求实现链式表的操作集。原创 2025-01-24 12:34:52 · 62 阅读 · 0 评论