数据结构与算法分析
文章平均质量分 93
无条件j
这个作者很懒,什么都没留下…
展开
-
数据结构与算法(十二)——二叉树的存储和遍历(概念)
我们举相同的例子。先处理以A为根结点的树:再处理以B为根结点的树:再处理以D围殴根结点的树:此时我们就把整棵树左子树给遍历完了此时的中序遍历结果:GDHBA再处理以C为根结点的树:再处理以E为根结点的树:此时就将整棵树遍历完了。完整的中序遍历顺序是:GDHBAEICF。原创 2024-01-10 18:19:48 · 925 阅读 · 1 评论 -
数据结构与算法(十一)——二叉树的相关概念
定义:二叉树(Binary Tree)是指树中结点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。二叉树的特点有:(1)每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注意不是只有两棵子树,而是最多有。没有子树或者有一棵子树也是可以的。(2)左子树和右子树是有顺序的,次序不能任意颠倒。就像人的左脚和右脚,穿鞋的时候不能穿反。(3)原创 2023-09-13 21:54:08 · 134 阅读 · 1 评论 -
数据结构与算法(十)——树的存储
这种方法在面对树中各结点的度相差很大时,显然是很浪费空间的,因为有很多的结点,它没有那么多孩子结点,所以造成了指针域是空的。具体办法是,把每个结点的孩子排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。当然,对于树这样的层级结构来说,只研究结点的兄弟是不行的,我们观察后发现,这种方法克服了浪费空间的缺点,对空间的利用率是很高了,但是由于各个结点的链表是不同的结构,加上要维护结点的度的数值,在运算上就会带来时间的损耗。但是,树的每个结点的度,也就是它的孩子个数是不同的。原创 2023-09-12 20:49:07 · 118 阅读 · 1 评论 -
数据结构与算法(九)——树的概念
定义:树(Tree)是n(n>=0)个结点的有限集。当n==0的时候,我们称之为空树。在任意一棵非空树中,有几个特点:(1)有且仅有一个特定的称为根(Root)的结点。(2)当n>1时,其余结点可以分为m个互不相交的有限集,T1,T2,T3....Tm,其中每一个集合本身又是一棵树,并且被称为根的子树(SubTree)。乍一看定义很长,看起来很懵。不急,咱一句句解释。第一句“树(Tree)是n(n>=0)个结点的有限集。” ,这里重点是有限集,首先它是一个集合,集合里面装的啥?装的是n个结点。原创 2023-09-07 17:26:44 · 99 阅读 · 1 评论 -
数据结构与算法(八)——双端队列
双端队列(Double-ended Queue,简称Deque)是一种具有队列和栈特性的数据结构,可以在队列的两端进行插入和删除操作。双端队列允许从前端和后端同时进行插入和删除操作,因此可以称为“两端都可以进出的队列”。双端队列有以下几个特点:1、可以在队列的头部和尾部进行插入和删除的操作。2、元素的插入和删除操作可以分别称作入队和出队操作。3、可以进行先进先出(FIFO)和先进后出(LIFO)两种操作方式。4、可以实现栈和队列以及其他需要在两端进行插入和删除操作的场景。原创 2023-09-05 22:29:50 · 2040 阅读 · 1 评论 -
数据结构与算法(七)——队列
定义:队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。从这个定义我们就能看出来和栈的区别,栈的定义是:限定仅在表尾进行插入和删除操作的线性表。1.队列是一种先进先出(First In First Out)的线性表,简称FIFO。2.只允许插入的一端称为队尾,允许删除的一端称为队头。原创 2023-08-06 03:01:44 · 92 阅读 · 0 评论 -
数据结构与算法(六)——栈
(一)什么是栈?原创 2023-07-31 22:23:37 · 78 阅读 · 1 评论 -
数据结构与算法(五)——线性表(下)循环链表篇
(一)循环单链表概念Q:循环链表是个啥,它跟单链表有什么联系?A:实际上循环单链表就是由单链表变来的。你可以将循环链表看做成,单链表的尾结点(最后一个结点)原本是指向NULL的。然后我们改变它的指向,最终指向头结点,这样就实现了循环的目的。画个图理解一下:顺便预告一下(这个图只是为了理解循环链表概念,后面写代码不是以这个为准,头尾指针的问题还会讨论)Q:为什么循环链表还要保留一个没有数据的头结点?这样循环起来跳过这个点挺麻烦的。A:说白了还是为了一致性。为了使空链表和非空链表一致。原创 2023-07-09 15:26:27 · 93 阅读 · 1 评论 -
数据结构与算法(四)——线性表(下)双向链表篇
上一篇讲到了静态链表,它的本质和单链表相同,换了一种实现的形式罢了。双向链表和单向链表的不同就在于,它可以指向前面,也可以指向后面。所以自然想到在指针域中多添加一个Pre指针(指向该结点的前驱),配合上Next指针,就可以达到效果。因为之前我们去找结点2是利用结点1的Next,现在结点1的Next都修改了,所以就找不到了结点2了。找都找不到,更不可能改变不结点2的Pre了。第二步的逻辑:结点2->Next->Pre=结点2->Pre;第一步:新结点的Next指向结点2,Pre指针指向结点1。原创 2023-07-08 20:44:21 · 83 阅读 · 0 评论 -
数据结构与算法(三)——线性表(下)静态链表篇
Q1:啥叫静态链表?简单点说静态链表是用数组描述的链表。注意:和前面的线性存储不一样,这里是用数组模拟链表。Q2:为啥会出现静态链表这种东西?A:这就得说说C语言的伟大了,因为它具有指针的能力,这样使得它可以非常容易的操作内存中的地址和数据。但后来的面向对象语言,如:Java、C#等。它们是没有指针这个东西的。更别说一些早期的语言,如:Basic、Fortran等。由于没有指针,按照之前单链表的结构,指针域就没办法实现。所以衍生了静态链表这个产物。Q3:那我们是如何用数组描述链表的呢?原创 2023-07-03 02:54:24 · 3071 阅读 · 3 评论 -
数据结构与算法(二)——线性表(中)
一个数据域储存数据,另一个是指针域指向为“空”(NULL),因为它没有后继了嘛。原创 2023-06-30 01:09:40 · 110 阅读 · 0 评论 -
数据结构与算法(一)——线性表(上)
作为一名计算机专业的学生,每次查资料的时候发现,很多的资料查阅需要付费而且答案冗长不精炼。于是自己就想着能不能自己写一个免费“合集”,细致的去介绍数据结构与算法。一方面巩固自己的知识。更重要的是,如果可以帮助很多初学者解决问题那么这就是一件有意义的事。这个合集是以Weiss教授的《数据结构与算法分析C语言描述》为蓝本,自己修改了一些章节的学习位置(为了帮助理解),总而言之希望大家看到这篇文章的时候能够解决很多问题。最后一点,由于笔者能力有限,如果出现了一些错误欢迎大家评论区来指正,一起做好这个专栏。原创 2023-06-29 00:30:38 · 145 阅读 · 1 评论