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

常见的数据结构:

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

数组:

直达数组!

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

栈(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阶最多有2^i-1个节点(此时为满枝二叉树)。

​二叉树的特点:

1.每个节点最多只能有两棵子树,且有左右之分​;
2.二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树右子树的二叉树组成,是有序树;​
3.当集合为空时,称该二叉树为空二叉树。
4.在二叉树中,一个元素也称作一个节点​。

(a)称做左斜树(left skew tree),每一节点的右子树皆为空集合;
(b)称为完整二元树(complete binary tree),节点排列顺序同满枝二元树,但节点数小于2k-1 ;
©称为满枝二元树(fully binary tree),含有节点数共为2k-1。

在这里插入图片描述

红黑树:

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

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

红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但
对之进行平衡的代价较低, 其平均统计性能要强于 AVL 。

由于每一棵红黑树都是一颗二叉排序树,因此,在对红黑树进行查找时,可以采用运用于普通二叉排序树上的查找算法,在查找过程中不需要颜色信息。

红黑树的特点:

红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 结点是红色或黑色。
性质2. 根结点是黑色。
性质3. 所有叶子都是黑色。(叶子是NIL结点)NIL结点指的是叶结点空的左右子结点延伸出来的的结点。
性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)
性质5. 从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

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

在这里插入图片描述

节点和结点的区别:

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

欢迎关注微信公众号:小红的成长日记,一起学Java!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值