数据结构大致包含以下几种存储结构:
-
线性表
,还可细分为顺序表、链表、栈和队列; -
树结构
,包括普通树,二叉树,线索二叉树等; -
图存储结构
;
线性表
线性表并不是一种具体的存储结构,它包含顺序存储结构
和链式存储结构
,是顺序表
和链表
的统称。
具有“一对一”
逻辑关系的数据,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致
,也就是说,线性表存储的数据,要么全部都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。
顺序表
顺序表,简单地理解,就是常用的数组。
由于顺序表结构的底层实现借助的就是数组,因此对于初学者来说,可以把顺序表完全等价为数组,但实则不是这样。数据结构是研究数据存储方式的一门学科,它囊括的都是各种存储结构,而数组只是各种编程语言中的基本数据类型,并不属于数据结构的范畴。
使用顺序表时,需要提前申请
一定大小的存储空间,这块存储空间的物理地址是连续的
。正常状态下,顺序表申请的存储容量要大于
顺序表的长度。
顺序表查找算法可以用顺序查找
和二分查找
,前提就是有序
。而链表则不适用二分查找。
优缺点
:查找存取高效,即可以通过下标操作。
增删低效,因为需要牵一发而动全身。
查找某个元素,无论单链表,还是数组(无序),复杂度都是O(n)。
找到待删除的元素以后,进行删除操作时,链表可以将待删除的节点的前继节点next指针直接指向待删除元素的后续节点即可,时间复杂度是O(1);而数组需要进行搬移操作,时间复杂度是O(n)
链表
使用链表存储数据时,是随用随申请,因此数据的存储位置是相互分离的,换句话说,数据的存储位置是随机的
。
链表的普通节点包括数据域
和指针域
。
因为物理位置随机,所以需要指针域
来将随机的位置串起来
。链表的增删都是通过改变指针域指向
来完成的。
节点
:链表中的节点又细分为头节点、首元节点和其他节点:
-
头节点
:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题,尤其是单链表中,增肌头节点可以少一些头部指针的判断; -
首元节点
:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点
。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义; -
其他节点
:链表中其他的节点;
优缺点
:增删高效,查找低效,因为查找时,需要循环链表访问。
循环链表:尾结点指向头结点。
- 单向链表结束的标志是尾节点的下一个节点为
NULL
- 循环链表结束的标志是尾节点的下一个节点为
头节点
题目分析:查找单链表的中间节点。
- 对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进而遍历第二遍找出中间位置的数据。这种方式非常简单。
- 若题目要求只能遍历一次链表,那又当如何解决问题?可以采取建立两个指针,一个指针一次遍历两个节点,另一个节点一次遍历一个节点,当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置,这种解决问题的方法称为
快慢指针方法
。
栈和队列
栈和队列隶属于线性表,是特殊的线性表
,因为它们对线性表中元素的进出做了明确的要求。
栈�: FILO
,先进后出
队列:FIFO
,先进先出
二叉树
简单地理解,满足以下两个条件的树就是二叉树:
- 本身是有序树;
- 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;
叶子结点
:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。单个结点也是一棵树。
度:结点有多少分支成为结点的度。一棵树的度是树内各结点的度的最大值
。
- 二叉树中,第 i 层最多有 2^(i-1) 个结点。
- 如果二叉树的深度为 K,那么此二叉树最多有 2^K-1 个结点。
- 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。
满二叉树
如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。
完全二叉树
如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。特点:叶子结点只能出现在最下层和次下层
二叉查找树
1.左子树上所有结点
的值均小于或等于
它的根结点的值。
2.右子树上所有结点
的值均大于或等于
它的根结点的值。
这种特点正契合了二分查找
的思想,它改善了二叉树节点查找的效率。
二叉查找树在插入新节点的时候可能会产生效率问题,例如要插入的数为5、4、3、2、1,则这五个数会线性的都插在节点左侧,会使查找性能折扣。于是红黑树就是为了解决这种情况
红黑树
红黑树是一种自平衡的二叉查找树
,是一种高效的查找树。
普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等。这些自平衡的查找树通过定义一些性质,将任意节点的左右子树高度差控制在规定范围内,以达到平衡状态。
特点如下
节点是红色或黑色。
根节点是黑色。
每个叶子节点都是黑色的空节点(NIL节点)。
每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
当插入的节点无法使红黑树维持自我平衡和满足条件,可以通过变色、旋转
来平衡自己。