常用数据结构

一、线性表

是一种线性结构,由零个和多个数据元素构成的有限序列

特征:

在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱和一个直接后继,而头元素没有直接前驱,尾元素没有直接后继

数据结构中常见的线性结构有数组、单链表、双链表、循环链表等

1.数组

在实际的物理内存上也是连续存储的,数组有上界和下界,下标从0开始,第一个元素称为下界,最后个元素称为上界,超过这个范围的下标使用数组,将造成数组越界错误。数组分为固定数组和动态数组,固定数组的大小必须在编译时就确定, 动态数组允许在运行时申请数组内存

特点:数据连续,支持快速随机访问

2.单向链表

由节点构成,每个节点内都包含下一个节点的指针,节点依次链接成链表,因此在物理内存上是不连续的

特点:数据不连续,随机访问慢,增删元素效率高

3.双向链表

跟单链表一样, 双链表也是由节点组成,每个节点都有两个措针,分别指向直接前驱和直接后继,因此,从任一节点开始, 都可以很方便的访问它的前驱和后继节点

4.栈

特点:

(1)栈中的数据按照“先进后出”(FILO) 的方式进出栈

(2)添加/删除元素时,只能从栈顶进行操作

栈通常包括以下三种操作

push 向栈中添加元素

peek 返回栈顶元素

pop 返回并删除栈顶元素

5.队列

特点:

(1)队列中的数据按照“先进先出”(FIFO) 的方式进出队列

(2)在队尾添加元素(入队),在队首删除元素(出队)

二、树

树是n(n=-0)个节点的有限集,n=0称为空树,n>0时,有限集的元素构成一个具有层次感的数据结构。 区别于线性表的一对一的元素关系,树中的节点是一对多的关系

树具有以下特点:

(1) n>0时, 根节点是唯一的,不存在多个根节点

(2)每个节点有零个至多个子节点,除了根节点外,每个节点有且只有一个父节点,根节点没有父节点

树的相关概念/术语:

(1)子树

除根节点外,每个子节点都可以分为多个不相交的子树

(2)孩子与双亲

若一个节点有子树,那么该节点称为子树的双亲,子节点称为该节点的孩子

(3)兄弟

具有相同双亲的节点互为兄弟

(4)节点的度

一个节点拥有子树的数量

(5)叶子

没有子树,即度为0的节点

(6)分支节点

除叶子节点外的节点,即度不为0的节点

(7)内部节点

除根节点外的分支节点

(8)层次

根节点为第一层,其余节点的层数等于其双亲节点的层次加一

(9)树的高度

也称为树的深度,树中节点的最大层次

(10)有序树

树中节点各子树之间存在次序,不可随意交换位置

(11)无序树

树中节点各子树之间的次序不重要,可随意交换位置

(12)森林

0或多棵互不相交的树的集合

1.二叉树

满足以下两个条件的树即为二叉树

(1)本身是有序树,且区分左右子树,不可随意交换子树位置

(2)树中包含的各个节点的度不能超过2,即只能是0、1或者2。0表示该节点为叶子节点,1表示该节点只有左子树或右子树,2表示该节点有左右子树

2.斜树、满二叉树、完全二叉树、二叉查找树

2.1斜树

分为左斜树和右斜树,所有节点都只有左子树的二叉树称为左斜树,反之称为右斜树,二者统称为斜树。斜树已经退化成线性结构,无法体现出二叉树查找的优异性

2.2满二叉树

需要满足以下两个条件:

(1)所有节点都具有左右子树

(2)所有叶子节点都在同一层

在同样深度的二叉树中, 满二叉树的节点数量是最多的, 叶子节点的数量也是最多的

2.3完全二叉树

如果二叉树中除去最后一层节点为满二叉树,且最后一层的节点依次从左到右分布, 则此二叉树被称为完全二叉树

2.4二叉查找树(BST, Binary Search Tree)

又称为二叉排序树或二叉搜索树,它改善了二叉树的查找效率。

二叉查找树具有以下性质:

(1)若左子树不为空,则左子树上所有节点的值都小于它根节点的值

(2)若右子树不为空,则右子树上所有节点的值都大于它根节点的值

(3)左、右子树也是二叉查找树

(4)没有键值相等的节点,即键值不能重复

3.平衡二叉树

遵循以下特点的二叉树, 即为平衡二叉树

(1)每棵子树中的左子树和右子树的高度差不能超过1

(2)每棵子树都要求是平衡二叉树

常见实现方法有AVL、红黑树、替罪羊树、Treap和伸展树等

遍历方式:

若二叉树为空,则返回空操作

(1)前序遍历(简记: VLR)

先访问根节点,然后遍历根节点的左子树,最后遍历右子树

(2)中序遍历(简记: LVR)

从根节点开始,先遍历根节点的左子树,然后访问根节点,最后遍历右子树

(3)后序遍历(简记: LRV)

从右到左先叶子后节点的方式遍历访问左右子树,最后访问根节点

3. 1AVL树的旋转

(1)单向右旋平衡处理

在根节点左子树的左子树上插入节点, 导致失去平衡,则需要进行一次向右的顺时针旋转

(2)单向左旋平衡处理

在根节点右子树的右子树上插入节点,导致失去平衡,则需要进行一次向左的逆时针旋转

(3)双向旋转(先左后右)平衡处理

在根节点左子树的右子树上插入节点,导致失去平衡,则需要进行两次旋转操作

(4)双向旋转(先右后左)平衡处理

在根节点右子树的左子树上插入节点,导致失去平衡,则需要进行两次旋转操作

3.2红黑树

红黑树的特点:

(1)是一种二又查找树,所以根节点比左边的都大,比右边的都要小

(2)根节点是黑色

(3)默认将空节点作为叶子节点,且都是黑色

(4)黑色节点的左右子节点必须是红色

(5)每个节点到达其所有可达叶子节点路径上的黑色节点数量必须一致,即任意节点到该节点可达叶子节点路径上的所有黑色节点数量一样

注意:插入的新节点默认为红色,原因是需要满足此条

(6)每个节点要么红色要么黑色

红黑树的平衡方法:

(1)通过旋转,和AVL的旋转一样,即左旋和右旋

(口诀:左右左右)左旋:把该节点作为其右子节点的左子节点,被占的节点作为其右子节点

(口诀:右左右左)右旋:把该节点作为其左子节点的右子节点,被占的节点作为其左子节点

(2)通过改变节点的颜色,也就是对节点重新着色

如果需要两者结合的时候,先变色或先旋转都行,只要最后达到平衡即可

红黑树的删除:

删除非叶子节点,用对应的中序遍历(按照节点值的从小到大排序)的前驱节点顶替要删除节点的位置,之后根据需要再做重新平衡的操作

三、图(Graph)

由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G(V,E),其中G表示一个图,V表示图G中顶点的集合, E是图G中边的集合

图的相关术语:

(1)顶点的度

指图中与顶点相关联边的条数。对于有向图来说,顶点的度等于该顶点的出度与入度之和

(2)邻接

若无向图中的两个顶点V1和V2存在于条边(V1,V2), 则称顶点V1和V2邻接;若有向图中存在一条边<V3,V4> ,则称顶点V3和V4邻接,且V3邻接到V4或V4邻接到V3

(3)路径

在无向图中,若从顶点Vi出发有一组边可到达顶点Vj, 则称顶点Vi到顶点Vj的顶点序列为顶点Vi到顶点Vj的路径

(4)连通

若从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通的

(5)权(Weight)

有些图的边或弧具有与它相关的数字,则称该数字为权

1.1无向图

如果图中任意两个顶点之间的边都是无向边(没有方向的边)则称该图为无向图。无向图用小括号"()" 表示,如(V1,V2)

1.2有向图

如果图中任意两个顶点之间的边都是有向边(有方向的边),则称该图为有向图。有向图用小括号“<>"表示,如<V1,V2>

1.3完全图

(1)无向完全图

在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。n个顶点的无向完全图有n*(n 1)/2条边

(2)有向完全图

在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。n个顶点的有向完全图有n*(n-1)条边

2.图的遍历

(1)深度优先搜索遍历(DFS)

假设初始状态是图中所有顶点都未被访问,则从某个顶点V出发,首先访问该节点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和顶点V有路径相通的顶点都被访问到。若此时还有其他未被访问到的顶点,则另选一个未被访问到的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止

(2)广度优先搜索遍历(BFS)

又称宽度优先搜索或横向优先搜索。主要思想:从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得先被访问的邻接点先于后被访问顶点的邻接点被访问,直至图中所有已被访问顶点的邻接点都被访问到。如果此时图中还有顶点未被访问到,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。简单来说,广度优先搜索遍历图的过程是以顶点V为起点,由近至远,依次访问和V有路径相通且路径长度为1,2,3...的顶点

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 常用数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 ...
    孔雨露阅读 727评论 0 1
  • 介绍 数据结构是我们面试中经常会问到的一个问题,今天我们来简单介绍下我们常用的8中基本数据结构吧! 讲解流程: 一...
    风轻云淡_7152阅读 600评论 0 1
  • 数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。常用的数...
    Poppy11阅读 208评论 0 0
  • 前言 上一章我们简单的介绍了数据结构的逻辑结构和存储结构,简单的回顾就是: 数据结构分为: 逻辑结构集合结构线性结...
    码哥说阅读 338评论 0 6
  • 必须知道的8种常用数据结构。 1.数组 数组是固定大小的结构,可以容纳相同数据类型的项目。它可以是整数数组,浮点数...
    学编程的小屁孩阅读 188评论 0 0