常见的数据结构:
数据存储的常用结构有:栈、队列、数组、链表、线性表、树、二叉树和红黑树...
数组:
直达数组!
小红在成长,公众号:小红的成长日记Java开发——5.数组
是我们在第五节就系统的学习过了,数组只能存储相同类型的数据,查询快(对应下标查找),增删慢(指定位置增减或删除元素,需要移动大量元素);
栈(stack):
又名堆栈,类似马克杯只有一个入口;数据存储的时候也是通过入(压)栈和出(弹)栈决定;
位于杯口的位置是:栈顶;
位于杯底的位置是:栈低。
图解堆栈:
堆栈的特点:
1.它是运算受限的线性表,其限制是仅允许在栈顶的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
2.先进后出:先进栈的后出栈,后进栈的先出栈;
3.栈的入口和出口都在栈顶位置。
我们在后续学习集合的时候,Collection单列集合和Map双列集合都用运用到堆栈的操作;
Stack类代表最先进先出(LIFO)堆栈的对象。它扩展了类别Vector与五个操作,允许一个向量被视为堆栈。设置在通常的push(入栈)和pop(弹栈)操作,以及作为一种方法来peek在堆栈,以测试堆栈是否为empty的方法,以及向search在栈中的项目的方法在顶部项目和发现多远它是从顶部。
队列(queue):
简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除,队列就像小火车过隧道一样,相对堆栈它的特点是:先进队的先出队,后进队的后出队。
链表(linked list):
由一系列结点node(链表中每一个元素称为结点,注意和后面树中的节点是不同的)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是 存储数据元素的数据域,另一个是 存储下一个结点地址的指针域。我们常说的链表结构有单向链表与双向链表。
链表的特点:
查询慢(要查询某个指定位置的值,需要通过结点的地址域找到前面的值,然后依次递增,最后找到要查询的值),增删快(如果要删除某个指定位置的值,只需要在指定位置前面修改成为指定值的地址域,删除也是同样的方法)。
单向链表(One-way LinkedList):
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。
双向链表:
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向 直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
循环链表:
循环链表是一种链式存储结构,它的 最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。
链表的优点:
相比较普通的线性结构,链表结构的可以总结一下:
(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 ;
(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据
(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表。
线性表(linear list):
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。
线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全不都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。
线性表的特点:
(上述所讲到的数组、堆栈、队列、链表都是特殊的线性表,但是下面要学习的树就不是线性结构。)
“一对一”逻辑关系的数据!
- 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
- 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;
常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等)。
树:
树状结构是一个或多个节点的有限集合。树可以分为:二叉树、红黑树...
相关特点:
节点与边:节点代表某项资料,而边是指由一节点到另一节点的分支。
兄弟节点(sibling node):拥有同一父节点的子节点。如:E与F。
叶节点(leaf node)或终点节点(terminal node):没有子节点的节点。如:J、K等。
根节点(root node):没有父节点的节点,为树的源头。如:A。
阶度(level):为树中的第几代,而根节点为第一代,阶度为1。
高度(height):指一节点往下走到叶节点的最长路径。 如:A为3、F为1、L为0。
深度(depth):指从根节点到某一节点的最长路径。如:C为1、M为3。
二叉树:
二叉树又名“二元树”;
二元树(Binary tree):二元树里每一节点的最大分支度为2。 二元树的第i阶最多有2i-1个节点(此时为满枝二叉树)。
二叉树的特点:
1.每个节点最多只能有两棵子树,且有左右之分;
2.二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树;
3.当集合为空时,称该二叉树为空二叉树。
4.在二叉树中,一个元素也称作一个节点。
(a)称做左斜树(left skew tree),每一节点的右子树皆为空集合;
(b)称为完整二元树(complete binary tree),节点排列顺序同满枝二元树,但节点数小于2k-1 ;
(c)称为满枝二元树(fully binary tree),含有节点数共为2k-1。
红黑树:
红黑树,又名平衡二叉树。
红黑树(Red Black Tree) 是一种 自平衡二叉查找树(AVL树),是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
红黑树是一种 平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其 平均统计性能要强于 AVL 。由于每一棵红黑树都是一颗 二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。
红黑树的特点:
红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。 [3] 在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 结点是红色或黑色。
性质2. 根结点是黑色。
性质3. 所有叶子都是黑色。(叶子是NIL结点)NIL结点指的是叶结点空的左右子结点延伸出来的的结点。
性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。
是性质4导致路径上不能有两个连续的红色结点确保了这个结果。最短的可能路径都是黑色结点,最长的可能路径有交替的红色和黑色结点。因为根据性质5所有最长的路径都有相同数目的黑色结点,这就表明了没有路径能多于任何其他路径的两倍长。
总结_节点和结点的区别:
1.节点是一个实体,它具有处理的能力;
2.结点是一个交叉点、一个标记,算法中的点一般都称为结点,数据集合中的每一个数据元素都用中间标有元素值的方框来表示,我们称它为结点。