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

相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
28天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
30天前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
81 2
|
30天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
61 2
|
18天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
60 16
|
13天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
35 6
|
18天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
26天前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
61 7
|
26天前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
25 6
|
28天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
27 1

热门文章

最新文章

下一篇
无影云桌面