Java开发——21.数据结构(线性表+树)

简介: 数据存储的常用结构有:栈、队列、数组、链表、线性表、树、二叉树和红黑树...

常见的数据结构:

数据存储的常用结构有:栈、队列、数组、链表、线性表、树、二叉树和红黑树...


数组:

直达数组!

小红在成长,公众号:小红的成长日记Java开发——5.数组

是我们在第五节就系统的学习过了,数组只能存储相同类型的数据,查询快(对应下标查找),增删慢(指定位置增减或删除元素,需要移动大量元素);


栈(stack):

又名堆栈,类似马克杯只有一个入口;数据存储的时候也是通过入(压)栈和出(弹)栈决定;

位于杯口的位置是:栈顶

位于杯底的位置是:栈低

image.png


图解堆栈:

image.png


堆栈的特点:

1.它是运算受限的线性表,其限制是仅允许在栈顶的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。

2.先进后出:先进栈的后出栈,后进栈的先出栈;

3.栈的入口和出口都在栈顶位置。

image.png

我们在后续学习集合的时候,Collection单列集合和Map双列集合都用运用到堆栈的操作;

Stack类代表最先进先出(LIFO)堆栈的对象。它扩展了类别Vector与五个操作,允许一个向量被视为堆栈。设置在通常的push(入栈)和pop(弹栈)操作,以及作为一种方法来peek在堆栈,以测试堆栈是否为empty的方法,以及向search在栈中的项目的方法在顶部项目和发现多远它是从顶部。


队列(queue):

简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除,队列就像小火车过隧道一样,相对堆栈它的特点是:先进队的先出队,后进队的后出队

image.png


链表(linked list):

由一系列结点node(链表中每一个元素称为结点,注意和后面树中的节点是不同的)组成,结点可以在运行时动态生成。

每个结点包括两个部分:一个是 存储数据元素的数据域,另一个是 存储下一个结点地址的指针域。我们常说的链表结构有单向链表与双向链表。


链表的特点:

查询慢(要查询某个指定位置的值,需要通过结点的地址域找到前面的值,然后依次递增,最后找到要查询的值),增删快(如果要删除某个指定位置的值,只需要在指定位置前面修改成为指定值的地址域,删除也是同样的方法)。


单向链表(One-way LinkedList):

单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;

链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。


image.png


双向链表:

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向 直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

image.png


循环链表:

循环链表是一种链式存储结构,它的 最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。

image.png


链表的优点:

相比较普通的线性结构,链表结构的可以总结一下:

(1)单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小 ;

(2)结点的删除非常方便,不需要像线性结构那样移动剩下的数据

(3)结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表


线性表(linear list):

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

image.png

线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。使用线性表存储的数据,如同向数组中存储数据那样,要求数据类型必须一致,也就是说,线性表存储的数据,要么全不都是整形,要么全部都是字符串。一半是整形,另一半是字符串的一组数据无法使用线性表存储。


线性表的特点:

(上述所讲到的数组、堆栈、队列、链表都是特殊的线性表,但是下面要学习的树就不是线性结构。

“一对一”逻辑关系的数据!

  • 某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
  • 某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;

image.png


常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等)。


树:

树状结构是一个或多个节点的有限集合。树可以分为:二叉树、红黑树...


相关特点:

节点与边:节点代表某项资料,而边是指由一节点到另一节点的分支。

兄弟节点(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。

image.png


二叉树:

二叉树又名“二元树”;

二元树(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


image.png


红黑树:

红黑树,又名平衡二叉树。

红黑树(Red Black Tree) 是一种 自平衡二叉查找树(AVL树),是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。

红黑树是一种特化的AVL树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能

红黑树是一种 平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但 对之进行平衡的代价较低, 其 平均统计性能要强于 AVL 。由于每一棵红黑树都是一颗 二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。


红黑树的特点:

红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。 [3] 在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 结点是红色或黑色。

性质2. 根结点是黑色

性质3. 所有叶子都是黑色。(叶子是NIL结点)NIL结点指的是叶结点空的左右子结点延伸出来的的结点。

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

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


是性质4导致路径上不能有两个连续的红色结点确保了这个结果。最短的可能路径都是黑色结点最长的可能路径有交替的红色和黑色结点。因为根据性质5所有最长的路径都有相同数目的黑色结点,这就表明了没有路径能多于任何其他路径的两倍长。

image.png



总结_节点和结点的区别:

1.节点是一个实体,它具有处理的能力;

2.结点是一个交叉点、一个标记,算法中的点一般都称为结点,数据集合中的每一个数据元素都用中间标有元素值的方框来表示,我们称它为结点。

相关文章
|
2天前
|
存储 算法 Java
【Java高阶数据结构】并查集-最小生成树(下)
【Java高阶数据结构】并查集-最小生成树
11 3
|
2天前
|
存储 算法 Java
【Java高阶数据结构】并查集-最小生成树(上)
【Java高阶数据结构】并查集-最小生成树(上)
11 2
|
2天前
|
算法 Java
【Java高阶数据结构】图-图的表示与遍历(下)
【Java高阶数据结构】图-图的表示与遍历
12 1
|
1天前
|
Java 数据安全/隐私保护 Spring
Java 中 Spring Boot 框架下的 Email 开发
Java 中 Spring Boot 框架下的 Email 开发
18 2
|
2天前
|
Java
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
11 4
|
2天前
|
存储 算法 Java
Java 数据结构
5月更文挑战第9天
|
2天前
|
机器学习/深度学习
数据结构-----树的易错点
数据结构-----树的易错点
17 4
|
2天前
|
存储 算法
实验 2:树形数据结构的实现与应用
实验 2:树形数据结构的实现与应用
6 0
|
2天前
|
存储 算法 搜索推荐
【Java高阶数据结构】图补充-拓扑排序
【Java高阶数据结构】图补充-拓扑排序
7 1
|
2天前
|
算法 Java
【Java高阶数据结构】图的最短路径问题(下)
【Java高阶数据结构】图的最短路径问题
6 1