树-用Java托举

news2024/11/24 3:05:02

再讲完前面几个数据结构后,下面,我们开始对树进行一个讲解分析

在这里插入图片描述

引言

树是一种重要的数据结构,在计算机科学中有着广泛的应用。树是由节点和边组
成的非线性数据结构,具有层次结构和递归定义的特点。每个节点可以有多个子
节点,而树的顶部节点称为根节点。树结构可以用于表示层次关系、组织结构、
搜索树、表达式树等。

简单概念

树是n个节点的有限集。n=0时称为空树。在任意一颗非空树中:
1、有且仅有一个特定的称为根的结点
2、当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2 ...,其中每
一个集合又是一棵树,并且称为根的子树。

树的术语

基本

节点(Node):树的基本单元是节点。每个节点代表一个值,并可以具有指向其
	他节点的链接。每个节点可能具有零个或多个子节点。

根节点(Root):树的顶部节点称为根节点。它是树中唯一没有父节点的节点。
	从根节点开始,可以通过节点的链接沿着树的层次结构访问其他节点。

子节点(Child):树中每个节点可以有零个或多个子节点。子节点是直接连接
	到父节点的节点。

父节点(Parent):一个节点的父节点是指直接连接到该节点的节点。一个节点
	可能有一个父节点。

叶节点(Leaf):没有子节点的节点称为叶节点或终端节点。它们是树中的末端
	节点。

节点之间的关系

树中的节点之间具有特定的关系。父节点和子节点之间存在一对多的关系。同一
父节点下的子节点之间称为兄弟节点。


层数(Level):根节点的层数为0,它的子节点为第一层,以此类推。每个节点
	的层数等于它的父节点的层数加1。

高度(Height):树的高度是根节点到最远叶子节点的最长路径上的边数。树的
	高度反映了树的深度。

子树(Subtree):树中的任何节点都可以视为树的根,该节点及其所有后代节
	点组成的结构称为子树。

森林(Forest):森林是多个树的集合。如果一个树的根节点从其他树中删除,
	则这些树的集合称为森林。

树的类型

树的类型有多种形式,每种形式在不同的应用场景下具有特定的优势和用途

常见类型

二叉树(Binary Tree):二叉树是树的一种特殊形式,每个节点最多有两个子
节点。这两个子节点被称为左子节点和右子节点。二叉树可以为空树(没有任何
节点),也可以是一棵只有根节点的树。

二叉搜索树(Binary Search Tree):二叉搜索树是一种有序的二叉树,其中
每个节点的左子树上的值都小于该节点的值,而右子树上的值都大于该节点的
值。这种有序性质使得在二叉搜索树中进行查找、插入和删除等操作具有高效
性能。

平衡二叉树(Balanced Binary Tree):平衡二叉树(也称为AVL树)是一种特
殊的二叉搜索树,其左子树和右子树的高度差不超过1。通过自动平衡树的结构,平衡二叉树可以在查找、插入和删除操作上保持较为均衡的性能。

B树(B-Tree):B树是一种自平衡的搜索树,用于处理大量的数据和磁盘存储。
B树具有多个子节点和键值对的能力,并在每个节点上维护一个有序的键序列。
B树的特性使得它在数据库索引等应用中具有高效的查找和插入性能。

红黑树(Red-Black Tree):红黑树是一种自平衡的二叉搜索树,每个节点上有
一个存储的值和一个表示颜色的属性(红色或黑色)。红黑树通过特定的规则保
持平衡,以确保在任何情况下都能保持较为稳定的高度,从而提供高效的查找、
插入和删除操作。

哈夫曼树:哈夫曼树(也称为最优二叉树)是一种用于数据压缩和编码的树结构。
哈夫曼树的构建过程是基于给定的字符频率,先建立最小堆,然后每次从堆中选
取两个频率最小的节点组成新节点,再将新节点放入堆中,直到堆中只剩一个节
点时构建完成。构建完成后,哈夫曼树的前缀编码用于对字符进行压缩和解压缩。
哈夫曼树在图像压缩、文件压缩等领域有广泛的应用。

在这里插入图片描述

其他类型

Trie树(Trie Tree):Trie树(前缀树或字典树)是一种专门用于快速查找字
符串键的树结构。它的特点是将每个键表示为从根节点到叶节点的路径,而共享
的前缀会在树的不同分支上重复使用,这使得Trie树在处理大量字符串键的情况
下非常高效。

AVL树:AVL树是一种自平衡的二叉搜索树,以其发明者的姓氏命名。它在基本的
二叉搜索树的基础上添加了一个平衡条件:每个节点的左子树和右子树的高度差
不超过1。为了保持树的平衡,AVL树会在插入或删除节点时通过旋转操作进行调
整。由于平衡性的保持,AVL树的查找、插入和删除操作的时间复杂度都是
O(log n)。

2-3树(23树):2-3树(也称为2-3-4树)是一种多叉树,它可以具有2个、3个
或4个子节点。2-3树的特点是每个内部节点可以存储1个或2个键,并且有相应的
子树与之关联。2-3树具有以下性质:所有叶节点在同一层级上,内部节点的键
按非降序排列,并且每个节点的子树范围是按键的范围分割的。2-3树可以自动
调整和重新平衡,以保持树的平衡性。

堆:堆是一种完全二叉树,具有以下两个特性:最大堆(Max Heap)中,每个
节点的值都大于或等于其子节点;最小堆(Min Heap)中,每个节点的值都小
于或等于其子节点。堆是一种非常常用的数据结构,常用于实现优先队列和堆
排序等应用。堆的插入和删除操作的时间复杂度是O(log n)。

树的遍历

树的遍历是指按照一定的次序访问树中的每个节点,常用的遍历方式有3种
先序遍历		中序遍历		后序遍历

还有一种是	层次遍历

常见

先序遍历(Preorder Traversal):先序遍历以如下方式进行:
	访问根节点。
	递归地先序遍历左子树。
	递归地先序遍历右子树。
	先序遍历的顺序是根节点 → 左子树 → 右子树。先序遍历的应用包括打印
	树的结构、生成前缀表达式和复制树等。

中序遍历(Inorder Traversal):中序遍历以如下方式进行:
	递归地中序遍历左子树。
	访问根节点。
	递归地中序遍历右子树。
	中序遍历的顺序是左子树 → 根节点 → 右子树。中序遍历的应用包括对树进
		行排序(对于二叉搜索树)和获取有序的节点值。

后序遍历(Postorder Traversal):后序遍历以如下方式进行:
	递归地后序遍历左子树。
	递归地后序遍历右子树。
	访问根节点。
	后序遍历的顺序是左子树 → 右子树 → 根节点。后序遍历的应用包括计算表
	达式树和释放树等。

在这里插入图片描述

另外一种

层序遍历使用队列这种数据结构来实现。具体步骤如下:
	创建一个空队列,并将根节点入队。
	循环执行以下步骤,直到队列为空:
	出队并访问当前节点(打印节点值或存储节点值等)。
	将当前节点的所有子节点按从左到右的顺序入队。
	层序遍历按照从上至下、从左至右的顺序遍历树的每一层。它的输出结果是
		一个按序访问的节点序列。

树的应用
树这种数据结构在计算机科学和软件开发中具有广泛的应用,下面是一些典型的应用场景:

操作系统的文件系统结构中使用树来表示目录结构。
数据库索引使用B树或红黑树等树结构来快速搜索数据。
表达式树(Expression Tree)
对数据结构树的基本概念进行一下详细分析

这些基本概念提供了树数据结构的核心概念和术语。树的结构非常灵活,可以在各种领域和应用中以不同的方式使用。理解这些概念对于正确使用树及其相关算法和数据结构非常重要。

树的应用

文件系统:文件系统常常以树的形式来组织文件和文件夹的层级结构。每个文件
夹(目录)可以包含多个子文件夹或文件,形成一个树的结构,方便进行文件的
组织和查找。

数据库管理系统:数据库中的索引常常使用B树或B+树来实现。这些树结构使得在
大量数据中进行高效的查找、插入和删除成为可能。

编译器:编译器在语法分析阶段使用语法树(也称为解析树)来表示代码的结构。
语法树有助于语法分析和代码优化等编译器任务。

人工智能:决策树是人工智能领域的常用算法,用于根据输入特征进行分类和预
测。决策树算法可以用于人脸识别、推荐系统和自然语言处理等任务。

网络路由:路由器使用路由表(通常是基于树结构的)来决定网络数据包的传输
路径,以实现高效的数据路由。

图形学:在计算机图形学中,场景和对象的层次结构常常表示为树状结构,用于
实现场景图、图层管理和3D模型的组织。

游戏开发:树结构在游戏中有很多应用,如场景图、状态机、行为树和物理碰撞
检测等。

人际关系网络:社交网络的关系可以表示为树状结构,每个人是一个节点,边表
示人与人之间的关系。

补充

实际上,树在许多其他领域也有重要的应用,如编码理论、数据压缩、语言处理
等。树的灵活性和可扩展性使得它成为一种重要的数据结构,在各种领域的问题
求解中发挥着重要作用。

在这里插入图片描述

代码实现

import java.util.ArrayList;
import java.util.List;

class TreeNode {
    private int value;
    private List<TreeNode> children;

    public TreeNode(int value) {
        this.value = value;
        this.children = new ArrayList<>();
    }

    public int getValue() {
        return value;
    }

    public List<TreeNode> getChildren() {
        return children;
    }

    public void addChild(TreeNode child) {
        children.add(child);
    }
}
上面代码定义了一个TreeNode类,包含一个值和一个子节点列表。节点的值可以
是任意类型,根据需要进行调整。子节点列表使用一个ArrayList来保存子节点。

这个基本的树实现允许创建一个节点、访问节点的值、获取子节点列表,并允许
添加子节点。

使用示例:

public class Main {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        TreeNode child1 = new TreeNode(2);
        TreeNode child2 = new TreeNode(3);
        TreeNode grandchild = new TreeNode(4);

        root.addChild(child1);
        root.addChild(child2);
        child2.addChild(grandchild);

        // 访问节点的值
        System.out.println("Root value: " + root.getValue());  // 输出:1
        System.out.println("Child1 value: " + child1.getValue());  // 输出:2
        System.out.println("Grandchild value: " + grandchild.getValue());  // 输出:4

        // 访问子节点列表
        List<TreeNode> children = root.getChildren();
        for (TreeNode child : children) {
            System.out.println("Child value: " + child.getValue());
        }
        // 输出:2, 3

        // 添加子节点
        TreeNode newChild = new TreeNode(5);
        child1.addChild(newChild);
        System.out.println("New child value: " + child1.getChildren().get(1).getValue());  // 输出:5
    }
}
上述示例创建了一个树,包含一个根节点和多个子节点。然后演示了如何访问节
点的值、访问子节点列表,并添加新的子节点。

在这里插入图片描述

注意

除此以外,可以根据需要添加更多的功能和方法来扩展树的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书

Yan-英杰的主 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 问题描述 报错信息如下 报错描述 解决方法 总结 【粉丝福利】 【文末送书】 目录&#xff1a; 本书特色&#xff1a; 问题描述 报错信息如下 Description:An attempt…

Docker 命令(二)

查看 docker 版本信息 docker version #查看版本信息docker 信息查看 docker info Client:Context: defaultDebug Mode: falsePlugins:app: Docker App (Docker Inc., v0.9.1-beta3)buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)Server:Containers: 0 …

get请求传入[ ]这类字符 返回400错误解决

问题描述 使用get请求查询&#xff0c;传入特殊字符 []时&#xff0c;接口报错。 分析原因 高版本的tomcat&#xff0c;有个新特性&#xff1a; 严格按照RFC 3986规范进行访问解析&#xff0c;而 RFC3986规范定义了Url中只允许包含英文字母&#xff08;a-zA-Z&#xff09;、数…

【Python】数据分析+数据挖掘——Pandas中文件I/O操作

文章目录 前言1. 读入文本格式数据文件1.1 pd.read_csv实例 1.2 pd.read_table1.3 pd.read_excel实例 1.4 pd.read_sql 2. 保存数据文件2.1 保存数据文件到外部文件中2.2 保存数据文件到数据库中 结束语 前言 在数据分析和数据挖掘中&#xff0c;数据通常以文件的形式存储在磁…

静电消除风机风棒的工作原理

静电消除风机风棒的工作原理静电消除离子风机是一种专门用于消除静电的设备。静电是由于物体表面带有静电荷而引起的现象&#xff0c;容易导致尘埃吸附、静电放电等问题。静电消除离子风机通过释放负离子或正离子来中和空气中的静电荷&#xff0c;从而减少静电问题的发生。 静…

【基于CentOS 7的Rsync服务】

目录 一、概述 二、特性 1.快速 2.安全 3.应用场景 三、数据的同步方式 1.pull 2.push 四、rsync传输模式 1.本地传输 2.远程传输 3.守护进程 五、rsync应用 1.安装 2.监听端口 六、rsync命令 1.格式 1.1 作为远程命令 1.2 作为rsync服务 2.选项 3.举例 …

服务器数据恢复-ESX SERVER无法连接到STORAGE的数据恢复案例

服务器数据恢复环境&#xff1a; 某公司信息管理平台&#xff0c;数台VMware ESX SERVER虚拟机共享一台IBM某型号存储。 服务器故障&#xff1a; VC报告虚拟磁盘丢失&#xff0c;管理员ssh到ESX中执行fdisk -l命令查看磁盘&#xff0c;发现STORAGE已经没有分区表了。重启设备后…

2023-7-20-第二十一式访问者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

unity预制体打包

unity做好的预制体如果给别的工程使用&#xff0c;如果是单纯的ctrlcv会导致丢失引用&#xff0c;如材质信息等&#xff0c;我们可以将其打包好再导入给别的工程。 如打包这个cube&#xff1a; 点击Export&#xff0c;选择保存位置

【算法基础:搜索与图论】3.2 树与图的dfs和bfs

文章目录 例题846. 树的重心&#xff08;深度优先遍历 / 树形DP&#xff09;⭐⭐⭐⭐⭐&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#xff08;重要&#xff01;好题&#xff01;&#xff09;847. 图中点的层次 相关链接 要学会建树、建图的通用方法。…

【C++】C++ 11 新特性

文章目录 &#x1f4d5; ★ 右值引用 ★概念左值引用和右值引用的比较使用场景和意义移动构造左值引用的缺陷 完美转发属性丢失为什么会属性丢失解决方法 &#x1f4d5; 新的类功能默认成员函数default 和 delete 关键字 &#x1f4d5; lambda 表达式问题的提出概念函数对象和 …

nuxt获取地址栏(路由)参数

要获取的路由地址&#xff08;页面顶部地址栏&#xff09;&#xff1a;http://172.31.0.1:5353/judge-manage?id3694089482878918764&name%E6%B5%8B%E8%AF%95&judgeIde9IJWN5usmzbrtNC3zYSRtAcKu-M333h 1、获取域名或ip端口&#xff1a;172.31.0.1:5353 2、获取地址…

JMeter的使用方法

JMeter是开源软件&#xff0c;100%的使用Java语言来进行开发的&#xff0c;支持主流的协议&#xff08;HTTP,HTTPS,WebService,gRPC&#xff09;的API测试和性能测试,是一款非常优秀的测试工具软件。 java 语言编写的程序&#xff0c;程序要运行&#xff0c;对外运行的程序有两…

Windows 2012 R2 编辑ini文本遇到的编码问题

在编辑服务端配置文件时&#xff0c;发现对于ini文本文件&#xff1a; 需注意点一&#xff1a;如果另存为UTF-8保存的实际上格式是UTF-8-BOM编码格式&#xff1b; 但是两种格式是存在差异的&#xff1a; 因此造成在使用C#调用系统DLL读取文件时并未报错&#xff0c;但是当使用…

access数据库注入

access数据库一般是100人以下的小型数据库&#xff0c;后缀是asp的网站 先加一个’看下回显内容&#xff0c;有没有报错 在用and 11 和and 12看下回复内容 and 12 有报错内容&#xff0c;可以确定存在注入点 猜数据库名字&#xff0c;asp的数据库后缀是mdb and exists(select *…

Java将数据集合转换导出为图片

将数据集合导出为图片 Java将数据集合转换导出为根据数据自适应大小的图片&#xff0c;并且保证数据的完整展示 工具类代码 package xxxxxxxxx;import cn.hutool.core.date.DateTime;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.se…

linux部署前后端项目

使用nginx部署前端vue项目&#xff1a; nginx的安装就不在过了&#xff0c;直接打包vue项目&#xff1a; npm run build运行完之后会生成一个dist文件夹 将dist文件夹复制到linux文件中&#xff0c;我这里放到了/usr/local/vue目录下&#xff1a; 打开nginx的conf目录下的ngi…

Vue3通透教程【十六】TS编译配置

文章目录 &#x1f31f; 写在前面&#x1f31f; 初始化配置文件⭐ target⭐ module⭐ lib⭐ types/node⭐ include⭐ outDir&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更…

muduo库的log

muduo 库里的日志打印比较复杂&#xff0c;跟标准库 std::cout << 似乎比较像吧&#xff0c;库里自己实现了“流”式的日志打印&#xff0c;今天一起来看一下。 int main(int argc, char* argv[]) {CLogger::setLogLevel(CLogger::INFO);LOG_INFO << "loggin…

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE

Xcode 15 beta 4 (15A5195m) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org visonOS …