数据结构

数据结构大致包含以下几种存储结构:

  • 线性表,还可细分为顺序表、链表、栈和队列;
  • 树结构,包括普通树,二叉树,线索二叉树等;
  • 图存储结构

线性表

线性表并不是一种具体的存储结构,它包含顺序存储结构链式存储结构,是顺序表链表的统称。

具有“一对一”逻辑关系的数据,即“把所有数据用一根线儿串起来,再存储到物理空间中”。

使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全部都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。

顺序表

顺序表,简单地理解,就是常用的数组。

由于顺序表结构的底层实现借助的就是数组,因此对于初学者来说,可以把顺序表完全等价为数组,但实则不是这样。数据结构是研究数据存储方式的一门学科,它囊括的都是各种存储结构,而数组只是各种编程语言中的基本数据类型,并不属于数据结构的范畴。

使用顺序表时,需要提前申请一定大小的存储空间,这块存储空间的物理地址是连续的。正常状态下,顺序表申请的存储容量要大于顺序表的长度。

顺序表查找算法可以用顺序查找二分查找,前提就是有序。而链表则不适用二分查找。

优缺点:查找存取高效,即可以通过下标操作。
增删低效,因为需要牵一发而动全身。

查找某个元素,无论单链表,还是数组(无序),复杂度都是O(n)。

找到待删除的元素以后,进行删除操作时,链表可以将待删除的节点的前继节点next指针直接指向待删除元素的后续节点即可,时间复杂度是O(1);而数组需要进行搬移操作,时间复杂度是O(n)

链表

使用链表存储数据时,是随用随申请,因此数据的存储位置是相互分离的,换句话说,数据的存储位置是随机的

链表的普通节点包括数据域指针域
因为物理位置随机,所以需要指针域来将随机的位置串起来。链表的增删都是通过改变指针域指向来完成的。

节点:链表中的节点又细分为头节点、首元节点和其他节点:

  • 头节点:其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题,尤其是单链表中,增肌头节点可以少一些头部指针的判断;
  • 首元节点:由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只是对链表中第一个存有数据节点的一个称谓,没有实际意义;
  • 其他节点:链表中其他的节点;

优缺点:增删高效,查找低效,因为查找时,需要循环链表访问。

循环链表:尾结点指向头结点。

  • 单向链表结束的标志是尾节点的下一个节点为NULL
  • 循环链表结束的标志是尾节点的下一个节点为头节点

题目分析:查找单链表的中间节点。

  • 对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进而遍历第二遍找出中间位置的数据。这种方式非常简单。
  • 若题目要求只能遍历一次链表,那又当如何解决问题?可以采取建立两个指针,一个指针一次遍历两个节点,另一个节点一次遍历一个节点,当快指针遍历到空节点时,慢指针指向的位置为链表的中间位置,这种解决问题的方法称为快慢指针方法

栈和队列

栈和队列隶属于线性表,是特殊的线性表,因为它们对线性表中元素的进出做了明确的要求。

栈�: FILO,先进后出
队列:FIFO,先进先出


二叉树

简单地理解,满足以下两个条件的树就是二叉树:

  1. 本身是有序树;
  2. 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

叶子结点:如果结点没有任何子结点,那么此结点称为叶子结点(叶结点)。单个结点也是一棵树。
度:结点有多少分支成为结点的度。一棵树的度是树内各结点的度的最大值

  • 二叉树中,第 i 层最多有 2^(i-1) 个结点。
  • 如果二叉树的深度为 K,那么此二叉树最多有 2^K-1 个结点。
  • 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。
满二叉树

如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。

完全二叉树

如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。特点:叶子结点只能出现在最下层和次下层


数据结构_第1张图片
full.gif
二叉查找树

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

这种特点正契合了二分查找的思想,它改善了二叉树节点查找的效率。

二叉查找树在插入新节点的时候可能会产生效率问题,例如要插入的数为5、4、3、2、1,则这五个数会线性的都插在节点左侧,会使查找性能折扣。于是红黑树就是为了解决这种情况

红黑树

红黑树是一种自平衡的二叉查找树,是一种高效的查找树。

普通的二叉查找树在极端情况下可退化成链表,此时的增删查效率都会比较低下。为了避免这种情况,就出现了一些自平衡的查找树,比如 AVL,红黑树等。这些自平衡的查找树通过定义一些性质,将任意节点的左右子树高度差控制在规定范围内,以达到平衡状态。

特点如下

  1. 节点是红色或黑色。

  2. 根节点是黑色。

  3. 每个叶子节点都是黑色的空节点(NIL节点)。

  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

当插入的节点无法使红黑树维持自我平衡和满足条件,可以通过变色、旋转来平衡自己。

你可能感兴趣的:(数据结构)