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

news2025/2/7 9:28:27

目录

一、什么是树

​编辑

二、树的相关组成

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.coloradmin.cn/o/2294219.html

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

    相关文章

    基于Python的智能物流路径优化算法研究与应用

    基于Python的智能物流路径优化算法研究与应用 摘要 随着电商行业的迅猛发展&#xff0c;物流配送的效率和成本成为影响企业竞争力的关键因素。本论文聚焦于基于Python语言实现智能物流路径优化算法的研究。通过对经典路径优化算法如Dijkstra算法、A*算法等的深入分析&#xff…

    Origin2024 软件安装步骤与百度网盘

    软件简介&#xff1a; Origin 2024是一款功能强大的科学绘图与数据分析软件&#xff0c;广泛应用于科研和工程领域&#xff0c;支持多种图形绘制、数据分析功能以及便捷的数据导入和管理。 网盘链接: https://pan.baidu.com/s/1MNQG2pD802LWxuIN40JfeA?pwdc85q 提取码:c85…

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

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

    嵌入式八股文面试题(一)C语言部分

    1. 变量/函数的声明和定义的区别&#xff1f; &#xff08;1&#xff09;变量 定义不仅告知编译器变量的类型和名字&#xff0c;还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型&#xff0c;但并不为它分配内存空间…

    Redis企业开发实战(二)——点评项目之商户缓存查询

    目录 一、缓存介绍 二、缓存更新策略 三、如何保证redis与数据库一致性 1.解决方案概述 2.双写策略 3.双删策略 3.1延迟双删的目的 4.数据重要程度划分 四、缓存穿透 (一)缓存穿透解决方案 (二)缓存穿透示意图 五、缓存雪崩 (一)缓存雪崩解决方案 (二)缓存雪崩…

    RK3568中使用QT opencv(显示基础图像)

    文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库: 这里使用的是正点原子的ubuntu虚拟机,在他的虚拟机里面已经安装好了opencv的库。 二、QT使用opencv 在QT pr…

    C++模板编程——完美转发与可变参函数模板

    1 基础概念 首先介绍几个概念&#xff1a; 假设现在有A、B、C三个函数。 直接调用&#xff1a;在A函数中调用C就叫做直接调用&#xff0c;不拐弯抹角。转发&#xff1a;在A函数中调用B函数&#xff0c;在B函数调用C函数&#xff0c;这就叫做转发。这种情况下&#xff0c;B函数…

    蓝桥杯单片机(十)PWM脉宽调制信号的发生与控制

    模块训练&#xff1a; 一、PWM基本原理 1.占空比 2.脉宽周期与占空比 当PWM脉宽信号的频率确定时&#xff0c;脉宽周期也确定了&#xff0c;此时改变占空比即可。当利用PWM脉宽周期改变LED灯的亮度时&#xff0c;灯是低电平亮&#xff0c;所以将低电平占空比改成10%即可实现…

    Redis --- 使用HyperLogLog实现UV(访客量)

    UV 和 PV 是网站或应用数据分析中的常用指标&#xff0c;用于衡量用户活跃度和页面访问量。 UV (Unique Visitor 独立访客)&#xff1a; 指的是在一定时间内访问过网站或应用的独立用户数量。通常根据用户的 IP 地址、Cookies 或用户 ID 等来唯一标识一个用户。示例&#xff1…

    postgresql-COALESCE函数、NULLIF函数、NVL函数使用

    COALESCE函数 COALESCE函数是返回参数中的第一个非null的值&#xff0c;它要求参数中至少有一个是非null的; select coalesce(1,null,2),coalesce(null,2,1),coalesce(null,null,null); NULLIF(ex1,ex2)函数 如果ex1与ex2相等则返回Null&#xff0c;不相等返回第一个表达式的值…

    【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器

    背景需求&#xff1a; 2024年1月13日&#xff0c;快要放寒假了&#xff0c;组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整&#xff0c;你自己看批注。” “还有你这个教案部分的模版有问题&#xff0c;太小&#xff08;窄&#xff09;了。考虑…

    Macos安装APOC拓展库

    文章目录 说明错误提示原因分析解决方法 说明 Macos安装APOC核心库 错误提示 There is no procedure with the name apoc.generate.ba registered for this database instance. Please ensure youve spelled the procedure name correctly and that the procedure is prope…

    Google C++ Style / 谷歌C++开源风格

    文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…

    HELLOCTF反序列化靶场全解

    level 2 <?php/* --- HelloCTF - 反序列化靶场 关卡 2 : 类值的传递 --- HINT&#xff1a;尝试将flag传递出来~# -*- coding: utf-8 -*- # Author: 探姬 # Date: 2024-07-01 20:30 # Repo: github.com/ProbiusOfficial/PHPSerialize-labs # email: adminhello-ctf.com…

    禅道社区版项目管理软件部署(记录篇)

    系统要求&#xff08;这里推荐使用docker容器化方式&#xff09;安装前的准备Docker快速安装最后通过查看地址验证是否部署成功开始界面化安装配置 禅道&#xff08;ZenTao&#xff09;是一款国产开源的项目管理软件&#xff0c;专注于敏捷开发流程&#xff0c;支持 Scrum 和 K…

    【Redis】主从模式,哨兵,集群

    主从复制 单点问题&#xff1a; 在分布式系统中&#xff0c;如果某个服务器程序&#xff0c;只有一个节点&#xff08;也就是一个物理服务器&#xff09;来部署这个服务器程序的话&#xff0c;那么可能会出现以下问题&#xff1a; 1.可用性问题&#xff1a;如果这个机器挂了…

    DockerFile详细学习

    目录 1.DockerFile介绍 2.DockerFile常用指令 3.指令详细讲解 4.实例 构建Node-Exporter 构建Alertmanager 构建Mariadb 1.DockerFile介绍 什么是 Dockerfile&#xff1f; Dockerfile 是一个文本文件&#xff0c;包含了构建 Docker 镜像的所有指令。 Dockerfile 是一…

    寒假2.5

    题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址&#xff0c;一直在刷新&#xff0c;并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1&#xff0c;index.php用post方式提交了两个参数func和p&#xff0c;func的值为date&#xff0c;p的值为Y-m-d h:i:s a 执行fu…

    中国销冠,比亚迪1月销量超30万台,出口量飙升83%

    近日&#xff0c;比亚迪公布的 1 月销量数据成为了汽车行业热议的焦点&#xff0c;比亚迪凭借 300538 辆的销量成绩&#xff0c;进一步巩固了其在新能源汽车市场的统治力&#xff0c;再次稳坐中国品牌汽车市场销冠宝座。 在 1 月的销售数据中&#xff0c;比亚迪王朝丨海洋系列无…

    大数据sql查询速度慢有哪些原因

    1.索引问题 可能缺少索引&#xff0c;也有可能是索引不生效 2.连接数配置&#xff1a;连接数过少/连接池比较小 连接数过 3.sql本身有问题&#xff0c;响应比较慢&#xff0c;比如多表 4.缓存池大小 可能是缓存问题&#xff08;命中率>99%&#xff09; 5.加了锁 6. redis&a…