当前位置:首页 > 科技  > 软件

用 Java 深入研究树,你了解多少?

来源: 责编: 时间:2023-11-03 09:16:48 380观看
导读树数据结构在我们编码和面试中都是很重要的知识。使用数据结构来组织数据,数据结构越高效,程序就会越好。今天,我们将深入探讨数据结构之一:树。今天,我们将介绍:什么是树?树的种类树的遍历和搜索什么是树?数据结构用于存储和

iZy28资讯网——每日最新资讯28at.com

树数据结构在我们编码和面试中都是很重要的知识。使用数据结构来组织数据,数据结构越高效,程序就会越好。iZy28资讯网——每日最新资讯28at.com

今天,我们将深入探讨数据结构之一:树。iZy28资讯网——每日最新资讯28at.com

今天,我们将介绍:iZy28资讯网——每日最新资讯28at.com

  • 什么是树?
  • 树的种类
  • 树的遍历和搜索

什么是树?

数据结构用于存储和组织数据。我们可以使用算法来操纵和使用我们的数据结构。通过使用不同的数据结构可以更有效地组织不同类型的数据。iZy28资讯网——每日最新资讯28at.com

树是非线性数据结构。它们通常用于表示分层数据。举一个现实的例子,分层的公司结构使用树来组织。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

树的组成部分

树是节点(顶点)的集合,它们通过边(指针)链接起来,代表节点之间的层次连接。节点包含任意类型的数据,但所有节点必须具有相同的数据类型。树与图类似,但树中不能存在环。树有哪些不同的组成部分?iZy28资讯网——每日最新资讯28at.com

根:树的根是没有传入链接的节点(即没有父节点)。将此视为树的起点。iZy28资讯网——每日最新资讯28at.com

子节点:树的子节点是一个节点,具有来自其上方节点(即父节点)的一个传入链接。如果两个子节点共享同一个父节点,则它们称为兄弟节点。iZy28资讯网——每日最新资讯28at.com

父节点:父节点具有将其连接到一个或多个子节点的传出链接。iZy28资讯网——每日最新资讯28at.com

叶子:叶子有一个父节点,但没有到子节点的传出链接。将此视为树的端点。iZy28资讯网——每日最新资讯28at.com

子树:子树是包含在较大树中的较小树。该树的根可以是较大树中的任何节点。iZy28资讯网——每日最新资讯28at.com

深度:节点的深度是该节点与根之间的边数。将此视为节点和树的起点之间有多少步。iZy28资讯网——每日最新资讯28at.com

高度:节点的高度是从该节点到叶节点的最长路径中的边数。将此视为节点和树端点之间有多少步。树的高度是其根节点的高度。iZy28资讯网——每日最新资讯28at.com

度:节点的度是指子树的数量。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

我们为什么要使用树?

树可以应用于很多事情。层次结构赋予树用于存储、操作和访问数据的独特属性。树构成了计算机最基本的组织结构。我们可以将树用于以下用途:iZy28资讯网——每日最新资讯28at.com

  • 存储为层次结构。存储层次结构中自然出现的信息。计算机上的文件系统和 PDF 使用树结构。
  • 搜索。存储我们想要快速搜索的信息。树比链表更容易搜索。某些类型的树(如 AVL 树和红黑树)是为快速搜索而设计的。
  • 继承。树可用于继承、XML 解析器、机器学习和 DNS 等。
  • 索引。高级类型的树(例如 B 树和 B+ 树)可用于为数据库建立索引。
  • 网络。树非常适合社交网络和电脑国际象棋游戏等。
  • 最短路径。生成树可用于查找路由器中的最短路径以进行网络连接。
  • 等等

如何编码一棵树

例如,要在Java中构建树,我们从根节点开始。iZy28资讯网——每日最新资讯28at.com

Node<String> root = new Node<>("root");

一旦我们有了根,我们就可以使用添加第一个子节点addChild,这会添加一个子节点并将其分配给父节点。我们将此过程称为插入(添加节点)和删除(删除节点)。iZy28资讯网——每日最新资讯28at.com

Node<String> node1 = root.addChild(new Node<String>("node 1"));

我们继续使用相同的过程添加节点,直到我们拥有复杂的层次结构。iZy28资讯网——每日最新资讯28at.com

树的种类

我们可以使用多种类型的树在层次结构中以不同的方式组织数据。我们使用的树取决于我们要解决的问题。让我们看一下可以在 Java 中使用的树。我们将涵盖:iZy28资讯网——每日最新资讯28at.com

  • N叉树
  • 平衡树
  • 二叉树
  • 二叉搜索树
  • AVL树
  • 红黑树
  • 2-3 棵树
  • 2-3-4 树

N叉树

在N叉树中,一个节点可以有0-N个子节点。例如,如果我们有一个二叉树(也称为二叉树),它最多有 0-2 个子节点。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

注: 节点的平衡因子是左右子树的高度差。iZy28资讯网——每日最新资讯28at.com

平衡树

平衡树是几乎所有叶子节点都在同一级别的树,最常应用于子树,即所有子树都必须是平衡的。换句话说,我们必须使树高平衡,左右子树的高度差不超过1。这是平衡树的直观表示。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

根据其结构,二叉树主要分为三种类型。iZy28资讯网——每日最新资讯28at.com

1、完全二叉树

当每一层(不包括最后一层)都被填满并且最后一层的所有节点都尽可能靠左时,就存在完全二叉树。这是完整二叉树的直观表示。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

2、满二叉树

当每个节点(不包括叶子)都有两个子节点时,就存在满二叉树(有时称为真二叉树)。每一层都必须填满,并且节点尽可能远离。查看此图以了解完整二叉树的外观。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

3、完美二叉树

完美的二叉树应该是满的和完整的。所有内部节点都应该有两个子节点,并且所有叶子节点必须具有相同的深度。查看此图以了解完美二叉树的外观。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

注意:还可以拥有倾斜二叉树,其中所有节点都向左或向右移动,但最佳实践是在 Java 中避免这种类型的树,因为搜索节点要复杂得多。iZy28资讯网——每日最新资讯28at.com

二叉搜索树

二叉搜索树是一棵二叉树,其中每个节点都有一个键和一个关联值。这允许快速查找和编辑(添加或删除),因此得名“搜索”。二叉搜索树根据其node值有严格的条件。需要注意的是,每个二叉搜索树都是二叉树,但并非每个二叉树都是二叉搜索树。iZy28资讯网——每日最新资讯28at.com

是什么让他们与众不同?在二叉搜索树中,子树的左子树必须包含键少于该节点键的节点,而右子树将包含键大于该节点键的节点。查看此视觉效果以了解这种情况。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

在此示例中,节点 Y 是具有两个子节点的父节点。子树 1 中的所有节点的值必须小于节点 Y,子树 2 中的所有节点的值必须大于节点 Y。iZy28资讯网——每日最新资讯28at.com

AVL树

AVL树是一种特殊类型的二叉搜索树,它通过检查每个节点的平衡因子来实现自平衡。平衡因子应该是+10-1。左右子树的最大高度差只能为1iZy28资讯网——每日最新资讯28at.com

如果这种差异变得大于一个,我们必须使用旋转技术重新平衡我们的树以使其有效。这些对于搜索是最重要操作的应用程序来说是最常见的。查看此视觉效果可以看到有效的 AVL 树。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

红黑树

红黑树是另一种自平衡二叉搜索树,但它具有 AVL 树的一些附加属性。节点的颜色为红色或黑色,以帮助在插入或删除后重新平衡树。它们可以节省平衡时间。那么,我们如何为节点着色呢?iZy28资讯网——每日最新资讯28at.com

  • 根部始终是黑色的。
  • 两个红色节点不能相邻(即红色父节点不能有红色子节点)。
  • 从根到叶的路径应包含相同数量的黑色节点。
  • 空节点是黑色的。

iZy28资讯网——每日最新资讯28at.com

2-3 棵树

2-3 树与我们目前学到的有很大不同。与二叉搜索树不同,2-3 树是一种自平衡、有序、多路搜索树。它始终是完美平衡的,因此每个叶节点与根的距离相等。除叶节点外,每个节点都可以是 2 节点(具有单个数据元素和两个子节点的节点)或 3 节点(具有两个数据元素和三个子节点的节点)。无论发生多少次插入或删除,2-3 树都会保持平衡。iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

2-3-4 树

2-3-4 树是一种比 2-3 树可以容纳更多键的搜索树。它涵盖了与 2-3 树相同的基础知识,但添加了以下属性:iZy28资讯网——每日最新资讯28at.com

  • 2-节点有两个子节点和一个数据元素
  • 3-Node 有三个子节点和两个数据元素
  • 4-节点有四个子节点和三个数据元素
  • 每个内部节点最多有 4 个子节点
  • 对于内部节点的三个键,LeftChild节点的所有键都小于左键
  • LeftMidChild 上的所有键都小于中间键
  • RightMidChild 处的所有键都小于右侧键
  • RightChild 处的所有键都大于右侧键

iZy28资讯网——每日最新资讯28at.com

树遍历和搜索简介

要使用树,我们可以通过访问/检查树的每个节点来遍历它们。如果一棵树被“遍历”,这意味着每个节点都被访问过。遍历一棵树有四种方法。这四个过程属于两类之一:广度优先遍历或深度优先遍历。iZy28资讯网——每日最新资讯28at.com

  • 中序:将其视为在树上向上移动,然后向下移动。遍历左子树及其子树,直到到达根。然后,向下遍历右孩子及其子树。这是深度优先遍历。
  • 前序:从根开始,遍历左子树,然后移动到右子树。这是深度优先遍历。
  • 后序:从左子树开始,移至右子树。然后,向上移动访问根节点。这是深度优先遍历。
  • 层序:将其视为一种之字形图案。这将按节点的级别而不是子树遍历节点。首先,我们访问根并从左到右访问该根的所有子节点。然后我们向下移动到下一个级别,直到到达没有子节点的节点。这是左节点。这是广度优先的遍历。

那么,广度优先遍历和深度优先遍历有什么区别呢?让我们看一下深度优先搜索 (DFS) 和广度优先搜索 (BFS) 算法,以便更好地理解这一点。iZy28资讯网——每日最新资讯28at.com

注意:算法是用于执行某些任务的指令序列。我们使用具有数据结构的算法来操作我们的数据,在本例中是遍历我们的数据。iZy28资讯网——每日最新资讯28at.com


iZy28资讯网——每日最新资讯28at.com

深度优先搜索

概述:我们沿着从起始节点到结束节点的路径,然后开始另一条路径,直到访问完所有节点。这通常使用堆栈来实现,并且它比 BFS 需要更少的内存。它最适合拓扑排序,例如图回溯或循环检测。iZy28资讯网——每日最新资讯28at.com

算法步骤DFS如下:iZy28资讯网——每日最新资讯28at.com

  • 选择一个节点。将所有相邻节点压入堆栈。
  • 从该堆栈中弹出一个节点并将相邻节点推入另一个堆栈。
  • 重复此步骤,直到堆栈为空或达到目标为止。当访问节点时,必须在继续之前将其标记为已访问,否则将陷入无限循环

广度优先搜索

概述:我们逐级访问一级的所有节点,然后再进入下一级。BFS算法通常使用队列来实现,并且它比DFS算法需要更多的内存。最适合寻找两个节点之间的最短路径。iZy28资讯网——每日最新资讯28at.com

算法步骤BFS如下:iZy28资讯网——每日最新资讯28at.com

  • 选择一个节点。将所有相邻节点放入队列中。将节点出队,并将其标记为已访问。将所有相邻节点放入另一个队列中。
  • 重复此操作,直到队列中没有已实现的目标。
  • 当访问节点时,必须在继续之前将其标记为已访问,否则将陷入无限循环

在二叉搜索树中搜索

了解如何在树中执行搜索非常重要。搜索意味着我们在数据结构中定位特定元素或节点。由于二叉搜索树中的数据是有序的,因此搜索非常容易。让我们看看它是如何完成的。iZy28资讯网——每日最新资讯28at.com

  • 从根开始。
  • 如果该值小于当前节点的值,则遍历左子树。如果大于,则遍历右子树。
  • 继续此过程,直到到达具有该值的节点或到达叶节点,这意味着该值不存在。

在3.中步奏,如下iZy28资讯网——每日最新资讯28at.com


iZy28资讯网——每日最新资讯28at.com

iZy28资讯网——每日最新资讯28at.com

现在让我们看看 Java 代码中的内容!iZy28资讯网——每日最新资讯28at.com

public class BinarySearchTree {      …            public boolean search(int value) {            if (root == null)                  return false;            else                  return root.search(value);      }}public class BSTNode {      …      public boolean search(int value) {            if (value == this.value)                  return true;            else if (value < this.value) {                  if (left == null)                        return false;                  else                        return left.search(value);            } else if (value > this.value) {                  if (right == null)                        return false;                  else                        return right.search(value);            }            return false;      }}

总结

本篇让我们更深入了解树的数据结构以及用的运用。iZy28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16737-0.html用 Java 深入研究树,你了解多少?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 慌了,我老板说:AI 将100% 取代前端

下一篇: 如何让 Bean 深度感知 Spring 容器

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top