Java数据结构与算法之“树”

目录

一、什么是树

​编辑

二、树的相关组成

1. 常用名词

2.需要了解的名词

三、树的分类

(一)初级树

1.普通树

2.二叉树

(二)中级树

1.哈夫曼树HuffmanTree

2.二叉搜索树BST

3.平衡二叉树AVL

(三)高级树

1.B树

2.Trie树

3.Merkle树

四、树的实例:二叉排序树

1.bst的代码实现

2.针对各类树不同应用场景的总结

3.下期预告


一、什么是树

一提到树,我们往往可以联系到生活中的树,在头脑中想象有有一颗参天大树,有根有叶有分支,树从底部的根向上蔓延分叉,在枝干上长出叶,结构分明。

但是在数据结构中我们接触到的树,往往会是一颗倒着的树:根在顶部,分支向下蔓延。

树是一种树形结构,也是数形结合的数学思维在计算机领域的一种实际应用。

我们不妨去类比公司组织架构、家谱等等。

学过前端相关知识的可以去参考dom(document object model)树,它就是通过解析将html文档解析为树形数据结构

            html(根节点)/    \head     body|       /   \title    h1   div\p(两个子节点)

为方便理解我将树与dom的结构一一对应列成了表格方便大家更深入的去理解。 

树结构术语DOM中的对应物示例
根节点<html> 标签整个文档的起点
父节点包含其他元素的元素<div> 包含 <p>
子节点被包含的元素<p> 是 <div> 的子节点
兄弟节点同一层级的元素两个并列的 <li>
叶子节点没有子元素的节点文本节点或空标签 <img>

二、树的相关组成

1. 常用名词

(1)节点

树中的每个元素称为节点。

每个节点包含一个值或数据,以及指向其子节点的链接。

位于树顶部的是根节点,如图A

(2)子树

由某个节点及其所有后代节点组成的树。

每个节点都可以看作是一个子树的根节点。

图中B、CEF、D构成了三棵子树

(3)空树

树是由n(n>=0)个结点组成的有限集合,其中当n=0时,它是一颗空树,空树是树的特例。

(4)叶子节点

没有子节点的节点。

也可以说是子树个数为0的节点。

叶子节点是树的末端节点。

如图BEFD

2.需要了解的名词

(1)节点的度

该节点所含子树的个数

同时也可以理解为:节点度是指和该节点相关联的边的条数,又称关联度。

(2)树的度

(节点的度)max

(3)节点的深度

根节点到当前节点所在唯一路径上的节点总数、

根节点的深度通常为1

(4)节点的高度

当前节点到最远叶子节点所在路径上的节点总数

(5)树的高度

(节点的高度)max

6)树的深度

(节点的深度)max

个人感觉深度往往比高度更加常用。

总结一下:

  • 根节点(Root):树的起点。
  • 父节点(Parent)子节点(Child)叶子节点(Leaf):层级关系。
  • 高度(Height) 和 深度(Depth):描述节点的相对位置。
  • 度(Degree):一个节点的子节点数量。

三、树的分类

个人根据树的复杂程度,按照学习难度分成了初级、中级、高级三种分类。

(一)初级树

1.普通树

任意节点可以有多个子节点且没有特殊约束。

2.二叉树

每个节点最多有两个子节点,这是二叉树最基本的结构。

(1)满二叉树

所有非叶子节点都有两个子节点,可以理解为所有层都填满节点。

(2)完全二叉树

除了最后一层可以不满但叶子节点必须靠左。

    (二)中级树

    1.哈夫曼树HuffmanTree

    更多的用在数据的压缩上,如文件压缩,基于字符的频率或权重变长编码实现更有效的存储。详细的建树过程我会单独放在一篇教程中。

    2.二叉搜索树BST

    BST:Binary Search Tree

    左子树的值<根节点的值<右子树的值

    3.平衡二叉树AVL

    一种自平衡的二叉搜索树

    AVL 是大学教授 G.M. Adelson-Velsky 和 E.M. Landis 名称的缩写,他们提出的平衡二叉树的概念,为了纪念他们,将 平衡二叉树 称为 AVL树。

    如果二叉排序树的子树间的高度相差太大,就会让二叉排序树操作的时间复杂度升级为O(n),为了避免这一情况,为最坏的情况做准备,就出现了平衡二叉树,使树的高度尽可能的小,其本质还是一棵二叉搜索树。

    可以概括为:

    • 左子树和右子树的高度之差的绝对值小于等于1
    • 左子树和右子树也是平衡二叉树

    4.红黑树

    (三)高级树

    这里暂时先不进行过多的介绍,了解即可。

    1.B树
    2.Trie树
    3.Merkle树

    用一个表格进行大致的总结:

    类型节点限制核心特征时间复杂度
    二叉树最多2个子节点递归结构基础遍历O(n)
    二叉搜索树左<根<右中序遍历有序查找O(h) h为树高
    AVL树平衡因子≤1严格平衡插入/删除O(log n)
    红黑树五大颜色规则近似平衡插入/删除O(log n)
    B树m阶树节点最多m-1个键多路平衡查询O(log_m n)
    哈夫曼树带权路径最短贪心算法构建构建O(n log n)
    完全二叉树+堆序性质根节点极值取极值O(1) 

    四、树的实例:二叉排序树

    1.bst的代码实现

    import java.util.Stack;public class TwoTree {public TreeNode root;//建树public void buildTree(TreeNode node){if(root == null){root = node;}else {TreeNode cur = root;while(true){if(cur.data > node.data){//排序树//比当前节点小,放左边,怎么放?if(cur.left == null){//左边空,放左边cur.left = node;break;}cur = cur.left;//迭代}else {//比当前节点大,放右边if(cur.right == null){cur.right = node;break;}cur = cur.right;//cur下移}}}}//二叉树的遍历:三序遍历---前序、中序、后序//测试用中序最方便,打印出来时升序,前后序没有规律,使用非递归方式public void inorder(TreeNode node){if(root==null){return;}else {TreeNode cur = root;//当前节点为根节点(cur类比指针)Stack<TreeNode> stack = new Stack<>();while (cur!=null || !stack.isEmpty()){//外部循环的作用:while(cur!=null){//压栈stack.push(cur);cur = cur.left;}//若为空则出栈TreeNode popNode = stack.pop();System.out.println(popNode.data);//检查出栈节点的右子树是否为空cur = popNode.right;//非常巧妙避免了重复判断//设置当前节点为出栈节点的右子节点}}}}class TreeNode{public TreeNode left;public TreeNode right;public int data;public TreeNode(){//空参}public TreeNode(int data){this.data = data;}
    }
    

    2.针对各类树不同应用场景的总结

    树的类型应用场景
    二叉搜索树(BST)需要快速查找的数据结构,如字典查找
    AVL 树读多写少的数据库索引
    红黑树STL map、set、Java TreeMap
    哈夫曼树数据压缩(如 ZIP、JPEG)
    B-Tree关系型数据库索引(如 MySQL)
    B+ Tree高效范围查询(如 InnoDB 引擎)
    Trie 树搜索引擎自动补全、拼写检查
    Merkle 树区块链数据校验

    3.下期预告

    预告:下一篇内容含有对本篇bst代码(建树、排序打印)的详细分析与一道完全二叉树实战算法个人版题解的介绍 ,内容丰富,欢迎提前关注!!

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

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

    相关文章

    【Linux】27.Linux 多线程(1)

    文章目录 1. Linux线程概念1.1 线程和进程1.2 虚拟地址是如何转换到物理地址的1.3 线程的优点1.4 线程的缺点1.5 线程异常1.6 线程用途 2. Linux进程VS线程2.1 进程和线程2.2 关于进程线程的问题 3. Linux线程控制3.1 POSIX线程库3.2 创建线程3.3 线程终止3.4 线程等待3.5 分离…

    SpringAI系列 - 使用LangGPT编写高质量的Prompt

    目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…

    2025.2.6

    一、C思维导图&#xff1a; 二、C&#xff1a; 三、注释代码 1> 配置文件&#xff1a;.pro文件 QT core gui # 引入的类库&#xff0c;core表示核心库 gui图形化界面库greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 超过版本4的qt&#xff0c;会自动加widgets…

    vue2-插槽slot

    文章目录 vue2-插槽slot1. 什么是slot2. slot分类2.1 默认插槽2.2 具名插槽2.3 作用域插槽 vue2-插槽slot 1. 什么是slot 在vue中&#xff0c;slot翻译为插槽&#xff0c;简单点说&#xff0c;就是在子组件内放置一个插槽&#xff0c;等待父组件在使用子组件的时候决定放什么…

    【算法应用】Alpha进化算法求解二维栅格路径规划问题

    目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 Alpha进化&#xff1a;一种具有进化路径自适应和矩阵生成的高效进化算法 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#…

    《深度洞察ICA:人工智能信号处理降维的独特利器》

    在人工智能技术飞速发展的今天&#xff0c;信号处理作为关键环节&#xff0c;面临着数据维度不断攀升的挑战。高维信号数据虽蕴含丰富信息&#xff0c;但也给处理和分析带来诸多难题&#xff0c;如计算资源消耗大、分析复杂度高、模型易过拟合等。独立成分分析&#xff08;ICA&…

    ubuntu20.04+RTX4060Ti大模型环境安装

    装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

    vmware虚拟机可以使用Windows的GPU吗

    是的&#xff0c;VMware虚拟机可以使用Windows的GPU&#xff0c;但这需要满足一定的条件&#xff0c;并且需要进行一些配置。以下是关键点&#xff1a; 1. 硬件要求 GPU支持直通&#xff08;Passthrough&#xff09;&#xff1a;你的物理GPU必须支持硬件直通&#xff08;VT-d…

    Spring Boot 2 快速教程:WebFlux优缺点及性能分析(四)

    WebFlux优缺点 【来源DeepSeek】 Spring WebFlux 是 Spring 框架提供的响应式编程模型&#xff0c;旨在支持非阻塞、异步和高并发的应用场景。其优缺点如下&#xff1a; 优点 高并发与低资源消耗 非阻塞 I/O&#xff1a;基于事件循环模型&#xff08;如 Netty&#xff09;&am…

    DeepSeek 硅基流动

    DeepSeek 硅基流动 &#x1f381; 四大神仙优势&#x1f31f; 三步拥有官网同款671B大模型1️⃣ 戳这里&#x1f449; 国内直连通道2️⃣ 复制API密钥3️⃣ 安装Chatbox贴进软件秒变AI大佬 &#x1f4c1; 网盘地址&#xff1a;&#xff08;所用到的软件可以直接下载&#xff09…

    利用UNIAPP实现短视频上下滑动播放功能

    在 UniApp 中实现一个短视频上下滑动播放的功能,可以使用 swiper 组件来实现滑动效果,并结合 video 组件来播放短视频。以下是一个完整的示例,展示如何在 UniApp 中实现这一功能。 1. 创建 UniApp 项目 如果你还没有创建 UniApp 项目,可以使用 HBuilderX 创建一个新的项目…

    ES6 变量解构赋值总结

    1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…

    数据库迁移后在密码不知道的情况下重建DBLINK

    9i和10gR1版本之前&#xff0c;所有 dblink 的密码都是以明文方式在 sys.link$ 中的password字段中存储。可以直接通过查询sys.link$基表进行SQL拼接来完成迁移dblink。 select create database link ||NAME || connect to || USERID || identified by || password || using…

    mysql 学习10 多表查询 -多表关系,多表查询

    多表关系 一对多 多对多 创建学生表 #多对多表 学生选课系统create table student(id int primary key auto_increment comment 主键ID,name varchar(64) comment 姓名,studentnumber varchar(10) comment 学号 )comment 学生表;insert into student(id,name,studentnumber)va…

    云端IDE如何重定义开发体验

    豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

    6. k8s二进制集群之各节点部署

    获取kubernetes源码安装主节点&#xff08;分别执行以下各节点命令&#xff09;安装工作节点&#xff08;同步kebelet和kube-proxy到各工作节点&#xff09;总结 继续上一篇文章《k8s二进制集群之ETCD集群部署》下面介绍一下各节点的部署与配置。 获取kubernetes源码 https:/…

    办理CE-notify-body资质流程详细讲解

    CE&#xff08;Notify Body&#xff09;即欧盟CE认证公告机构&#xff0c;俗称NB机构&#xff0c;以下是关于CE&#xff08;Notify Body&#xff09;的详细解释 定义与功能 &#xff1a; 定义 &#xff1a;CE&#xff08;Notify Body&#xff09;是经欧盟成员国认可的实体机构…

    JAVA异步的TCP 通讯-客户端

    一、客户端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutorService; impo…

    redis之RDB持久化过程

    redis的rdb持久化过程 流程图就想表达两点&#xff1a; 1.主进程会fork一个子进程&#xff0c;子进程共享主进程内存数据(fork其实是复制页表)&#xff0c;子进程读取数据并写到新的rdb文件&#xff0c;最后替换旧的rdb文件。 2.在持久化过程中主进程接收到用户写操作&#x…

    ElasticSearch学习笔记-解析JSON格式的内容

    如果需要屏蔽其他项目对Elasticsearch的直接访问操作&#xff0c;统一由一个入口访问操作Elasticsearch&#xff0c;可以考虑直接传入JSON格式语句解析执行。 相关依赖包 <properties><elasticsearch.version>7.9.3</elasticsearch.version><elasticsea…