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…

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

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

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

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

    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…

    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 编程助…

    redis之RDB持久化过程

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

    15.PPT:文静-云计算行业发展【29】

    目录 NO123​ NO345​ NO6​ NO78 NO9/10/11/12​ NO123 设计→幻灯片大小→自定义幻灯片大小→ 全屏显示&#xff08;16&#xff1a;9&#xff09;→最大化 NO345 SmartArt 主题颜色2/6/9&#xff1a;形状样式&#xff1a;样式 加大行距加宽间距 NO6 NO78 设计→设置背景…

    deepseek本地部署,使用python交互运行

    deepseek Github 地址&#xff1a;https://github.com/deepseek-ai/DeepSeek-R1 在Github中我们看到这样的图片&#xff0c;模型参数等都可以通过HuggingFace下载&#xff0c;DeepSeek-R1-Distill-Qwen-参数量&#xff0c;参数量越大&#xff0c;对显存的要求更高 我们以参数量…

    SpringUI Web高端动态交互元件库

    Axure Web高端动态交互元件库是一个专为Web设计与开发领域设计的高质量资源集合&#xff0c;旨在加速原型设计和开发流程。以下是关于这个元件库的详细介绍&#xff1a; 一、概述 Axure Web高端动态交互元件库是一个集成了多种预制、高质量交互组件的工具集合。这些组件经过精…

    Spring Boot整合MQTT

    MQTT是基于代理的轻量级的消息发布订阅传输协议。 1、下载安装代理 进入mosquitto下载地址&#xff1a;Download | Eclipse Mosquitto&#xff0c;进行下载&#xff0c;以win版本为例 下载完成后&#xff0c;在本地文件夹找到下载的代理安装文件 使用管理员身份打开安装 安装…

    网络数据请求

    1.GET和POST请求 1.1发送GET请求 1.2发送POST请求 1.3 在页面刚加载的时候请求数据 2.request请求的注意事项

    【OpenCV实战】基于 OpenCV 的多尺度与模板匹配目标跟踪设计与实现

    文章目录 基于 OpenCV 的模板匹配目标跟踪设计与实现1. 摘要2. 系统概述3. 系统原理3.1 模板匹配的基本原理3.2 多尺度匹配 4. 逻辑流程4.1 系统初始化4.2 主循环4.3 逻辑流程图 5. 关键代码解析5.1 鼠标回调函数5.2 多尺度模板匹配 6. 系统优势与不足6.1 优势6.2 不足 7. 总结…

    数据结构与算法学习笔记----博弈论

    # 数据结构与算法学习笔记----博弈论 author: 明月清了个风 first publish time: 2025.2.6 ps⭐️包含了博弈论中的两种问题Nim游戏和SG函数&#xff0c;一共四道例题&#xff0c;给出了具体公式的证明过程。 Acwing 891. Nim游戏 [原题链接](891. Nim游戏 - AcWing题库) 给…

    deepseek本地部署

    DeepSeek本地部署详细指南 DeepSeek作为一款开源且性能强大的大语言模型&#xff0c;提供了灵活的本地部署方案&#xff0c;让用户能够在本地环境中高效运行模型&#xff0c;同时保护数据隐私&#xff0c;这里记录自己DeepSeek本地部署流程。 主机环境 cpu:amd 7500Fgpu:406…

    VUE 集成企微机器人通知

    message-robot 便于线上异常问题及时发现处理&#xff0c;项目中集成企微机器人通知&#xff0c;及时接收问题并处理 企微机器人通知工具类 export class MessageRobotUtil {constructor() {}/*** 发送 markdown 消息* param robotKey 机器人 ID* param title 消息标题* param…

    消防救援营区管理2024年度回顾与分析

    2024年&#xff0c;消防救援营区管理领域在挑战与机遇并存的环境中取得了显著进展。站在产业和行业的角度&#xff0c;对这一年的回顾具有重要意义。 营区设施管理方面&#xff0c;基础设施建设与维护工作成效显著。 老旧营房的修缮确保了消防员居住环境的安全舒适&#xff0c;…