
从0开始数据结构与算法详解
文章平均质量分 89
数据结构与算法超详细教程,从理论到实践,彻底解决数据结构难的问题!!!
阿白逆袭记
( ̄. ̄)
展开
-
使用递归形式以及迭代形式实现树的前中后序遍历
相信大家对于二叉树的遍历并不陌生,对于二叉树的递归遍历我们也可以信手拈来。但是如果让我们将二叉树修改成为非递归的形式呢?是不是有点疑惑了?那么本次博客我们就来梳理一下二叉树的非递归遍历。由于递归遍历二叉树的代码以及逻辑都很简单,所以我们直接给出代码的结果,之后直接进行输出结果的比较即可。我们手动构建的树的形式如下图所示。原创 2024-05-29 12:49:28 · 987 阅读 · 0 评论 -
树形结构——堆的构建
在学习完我们的树形结构之后我们再来使用树形结构的思想构建一个堆。使用堆可以对我们的数据进行排序,并且堆排序的效率要远优于我们之前学习过的冒泡排序。下面我们来逐步实现堆这个数据结构。 在构建堆之前我们需要先介绍以下我们树形结构构建的两种形式:顺序存储和链式存储。顺序存储的形式也就是使用类似于数组的形式进行数据的存储。针对于树形结构的特点我们可以很容易的发现每一个父节点和孩子节点之间都有一定的关系 parent=(child-1)/2 或者使用儿子节点进行表示:child=parent*2+1表示左孩原创 2023-05-05 17:12:59 · 579 阅读 · 1 评论 -
树与二叉树
我们所有的节点都是从最上面的节点展开的,所以它叫做我们树的根节点。这里的相邻是指我们当我们最后一层的节点不满的时候我们的节点必须是一个左节点一个右节点再接着一个左节点......我们可以由一个左节点结束也可以由一个右节点结束。首先肯定要有的就是存储的数据,之后我们在查找树中的数据的时候肯定要查找我们相应的节点,所以我们还需要想办法进行查找同一层次的兄弟节点。我们可以通过孩子节点找到下一层的数据节点,同样我们还可以通过右兄弟节点查找到我们同一层次的所有的节点。🥧叶节点或终端节点:度为0的节点称为叶节点;原创 2023-05-05 17:17:23 · 492 阅读 · 0 评论 -
栈和队列的转换
栈1就会为空,之后我们想要输入数据就向栈1当中输入,想要拿出数据据从栈2当中拿,当我们栈2当中的数据全部拿完时,我们再将栈1当中的数据全部转入栈2当中即可。我们的栈每次只能从栈顶插入数据从栈顶拿出数据,当我们想要以队列的形式拿出数据的时候,也就是从栈的底端拿出数据,我们就必须一个一个将数据全部搬运到另一个栈当中。我们剩下的最后一个数据也就是我们以队列的形式想要出的数据。我们会发现我们移入栈2当中的数据全部已经是排好顺序的了,那么我们每次出数据的时候只需要从栈2当中拿出数据得到的就是我们队头的数据。原创 2023-05-01 08:40:34 · 685 阅读 · 0 评论 -
数据结构——队列的构建
我们依旧使用next指针进行连接,但是沃尔玛呢需要先判断情况,如果我们队列当中没有数据也就是size为0,那么我们就需要将我们的头节点和尾节点都更改为我们新开辟的节点。我们来分析一下:对于我们的队列我们需要在队尾插入元素,在我们链表的构建当中我们只能通过遍历才可以找到链表的最后一个元素,从这一点来看使用双循环链表似乎更具有优势。但是我们再来分析一下我们的队列,队列当中其他功能的完善似乎并不需要用到循环链表当中的功能,所以我们可以考虑能不能将我们单链表进行完善一下,直接使用单链表实现我们的队列。原创 2023-04-27 23:11:17 · 2255 阅读 · 0 评论 -
数据结构——栈的构建
对于这一部分其实非常的简单我们只需要对我们的参数进行断言保证我们的参数不为NULL 之后打印我们栈当中下标为top-1的数据即可。那么此上对于栈的构建也就全部结束了,在这一部分我们只是粗略的介绍了一下栈的构建思路,因为实质上的代码操作和顺序表相同,不熟悉的同学可以参考顺序表的构建方法,里面有详细有详细的讲解。我们在结构体当中创建的top就是反应我们数组当中存储数据的个数,相对应的也就是我们所需要栈中插入元素的下标。在将我们的数据插入栈中的之后我们就会让我们的 top++。最后就来到我们销毁栈的操作了。原创 2023-04-27 14:07:58 · 1796 阅读 · 0 评论 -
常见的链表的OJ题
所以对于本题我们需要进行的操作为:先找到来链表当中的中间节点,之后将我们的后半部分链表进行逆序,最后在判断我们前后链表的结构是否相同(可以剩下一个节点不做判断,即当我们节点的个数为奇数个时,我们只需要知道一个链表为空即为链表的遍历结束。(当我们链表当中的数据为奇数个的时候,满指针所指向的是中间的节点,快指针指向的是中间靠后的一个节点)我们想要复制上面的代码可以尝试着创建相等数量的节点,最后将我们每一个节点链接到我们相应节点的后面,之后将我们的random指针指向我们原链表当中节点的下一个即可。原创 2023-04-26 18:29:18 · 564 阅读 · 0 评论 -
单链表的实现
在本次博客当中我们来实现单链表。首先来介绍以下单链表,我们的单链表和顺序表一样都属于线性表。在逻辑结构上我们的链表也是“连续”存储的。就像下图中所示的一样: 为了使我们的每一个节点之间相互连接在一起所以在节点当中不能单纯的存储数据,我们还会空出一定的空间进行下一个节点的地址的存储。所以我们真实的链表的结构也就是物理结构如下: 通常情况下我们的节点类型分为存在哨兵节点的链表和不带哨兵节点的链表,不带哨兵节点的链表相对复杂,会了不带哨兵为节点的链表对于不带哨兵的链表也一定没什么问题,所以原创 2023-04-23 11:26:01 · 412 阅读 · 0 评论 -
双向链表的实现
否则再删除的话就有可能破坏循环链表的结构。之后我们想要将我们的新节点连接进入我们的链表当中,我们会发现想要在链表的尾部插入其实和在我们的phead之前插入是一样的道理,因为我们每一次遍历链表都是从phead开始的,所以最后遍历到的节点只需要在我们头节点的前方即可。在我们第一次构建循环链表的时候,最重要的就是创建头节点,我们需要梳理好我们的逻辑,当我们的链表当中只存在我们的头节点的时候,(也就代表我们我们链表当中的数据项为0)我们同样需要构建一个循环链表,只不过我们的循环当中只存在一个头节点。原创 2023-04-25 11:24:34 · 525 阅读 · 0 评论 -
顺序表的实现
⭐在我们的数据结构当中,有很多存储数据的方式,我们的顺序表就是其中最简单的存储数据的方式之一。我们先来简单的介绍一下我们的顺序表。⭐顺序表是线性表的一种,(线性表分为顺序表和链表)顺序表和我们的数组很相似,都是在内存当中开辟一块连续的空间进行数据的存储,但是对于我们的顺序表来说我们的数据必须是连续存储的。我们顺序表的实现大致思路和我们之前书写过的通讯录很类似,分为静态的顺序表和动态的顺序表两种。由于静态顺序表只能使用固定大小的空间,所以我们主要来实现更加灵活的动态顺序表。原创 2023-04-03 18:42:00 · 528 阅读 · 0 评论 -
算法的时间复杂度与空间复杂度
🌵所谓的算法的时间复杂度实际上就是评判算法的运行速度的一个衡量标准。但是呢,一个程序的运行时间也不完全由我们编写的程序的好坏所决定,也和很多因素有关。原创 2023-04-02 21:14:31 · 305 阅读 · 0 评论 -
数据结构基础——认识数据结构与算法
数据结构与算法详解。从0开始一步步学好算法,打下良好的基础!原创 2023-01-12 14:55:48 · 839 阅读 · 4 评论