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月前
|
算法
数据结构之博弈树搜索(深度优先搜索)
本文介绍了使用深度优先搜索(DFS)算法在二叉树中执行遍历及构建链表的过程。首先定义了二叉树节点`TreeNode`和链表节点`ListNode`的结构体。通过递归函数`dfs`实现了二叉树的深度优先遍历,按预序(根、左、右)输出节点值。接着,通过`buildLinkedList`函数根据DFS遍历的顺序构建了一个单链表,展示了如何将树结构转换为线性结构。最后,讨论了此算法的优点,如实现简单和内存效率高,同时也指出了潜在的内存管理问题,并分析了算法的时间复杂度。
53 0
|
14天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
36 5
|
28天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
54 5
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
92 16
|
1月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
52 6
|
1月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
2月前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
128 7
|
1月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
55 0
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
3月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现

热门文章

最新文章