Java集合源码分析之基础(三):树与二叉树

集合源码分析 一.集合的基本数据结构 1.数组 特点: 内存地址连续,使用之前必须要指定数组长度 可以通过下标访问的方式访问成员,查询效率高 增删操作会给系统带来性能消耗[保证数据下标越界的问题,需要动态扩容] 2.链表 特点: 灵活的空间要求,存储空间不要求连续 不支持下标的访问,支持顺序遍历检索 针对增删效率会更高些,只和操作节点的前后节点,无需移动元素存储位置 3.树 二叉树优点: 某节点的左子树节点值仅包含小于该节点值 某节点的右子树节点值仅包含大于该节点值 左右子树每个也必须是二叉查找 阅读详情

数组和链表都是用来解决一对一问题的,而一对多问题则需要树来解决。这里,我们重点关注二叉排序树,所以只会介绍一些必需了解的概念,关于树的更多知识,大家可以查看相关书籍进行系统的学习。

树的定义

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

下图就是一棵树:

 

树示意图

与现实中的树不同,数据结构里的树的根在最上方,并且只有一个根,就像一棵倒置的树。树的每个结点往下都是一棵子树,且这些子树不能相交,如下所示就不是一棵正确的树:

 

树的错误示例

相关概念

结点分类

树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度(Degree) 。度为0的结点称为叶结点(Leaf) 或终端结点;度不为0 的结点称为非终端结点或分支结点。除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。

如下图所示,A结点为根节点,G、H、I、J、F为叶节点,其余节点则为内部节点,此树的度为3。

 

度

结点间关系

结点的子树的根称为该结点的孩子(Child),相应地,该结点称为孩子的双亲(Parent)。同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。反之,以某结点为根的子树中的任一结点都称为该结点的子孙。

关系示意图

深度

结点的层次(LeveI)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第L层,则其子树的根就在第L+1 层。其双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度 。

深度示意图

有序树,无序树

如果将树中结点的各子树看成从左至右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。

二叉树

二叉树(Binary Tree)是n(n ≥ 0) 个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

下图就是一个二叉树,二叉树就是每个结点的度≤2的树。

 

二叉树示意图

二叉树有许多有用的性质,还有一些详细的分类,相关知识大家可以自行查阅资料。

二叉树遍历

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次旦仅被访问一次。

前序遍历

规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树, 再前序遍历右子树。

如下图所示,遍历结果为:ABDGHCEIF。

 

前序遍历

中序遍历

规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点) ,中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。

如下图所示,遍历结果为:GDHBAEICF。

 

中序遍历

后序遍历

规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。

如下图所示,遍历结果为:GHDBIEFCA。

 

后序遍历

如果喜欢我的文章,可以关注我哦!

二叉树java代码 java作业中的二叉树代码。在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子节点,至多有2k-1个节点。 立即下载

相关推荐

二叉树源代码

就是一个二叉树源代码,就是一个二叉树源代码,就是一个二叉树源代码,就是一个二叉树源代码,就是一个二叉树源代码,

数据结构-树与二叉树-C++代码实现

3.否则(注意这个else语句,否则包括:l<r 和 l=r 两种情况,比如某个结点为叶子结点,那么它的l=r=0,此时递归函数是有返回值的为:r+1,这点很容易被忽略,这也是递归能够持续下去的出发点)就返回r+1;假设B是A的孩子,T初始时指向A,比如T=T->Lchild执行后,此时T的指向已经发生改变,指向B,是一个动态递归的过程。2)数字和字母都属于字符,代码中定义data的数据类型为char型,所以输入数字和字母,代码都能完成遍历,无需将data类型改为int,反而会出错。

lljjhh001的博客 1867

二叉树的java实现

二叉树的java实现

C语言二叉树深度详解(附带源码)

一个节点含有的子树的个数称为该节点的度:度为0的节点:度不为0的节点:一个节点含有子节点,这个节点称为子节点的父节点(国外有些书称为双亲结点,涉及到女权主义):一个节点含有的子树的跟节点称为该节点的子节点:还有同一个父节点的节点互称为兄弟节点:一棵树中,最大的节点的度称为数的度:从根节点开始,根为第一层,根的子节点为第二层,以此类推(关于空树的高度最好从1开始,如果从0开始,空二叉树高度为0,而你只有一个根节点也称为0,矛盾)从该节点开始,往上回溯,都是该节点的祖先。

qq_51216031的博客 3684

图像超分辨率在医学影像中的应用:如何用深度学习提升CT/MRI图像质量

本文探讨了深度学习驱动的图像超分辨率技术在医学影像(如CT/MRI)质量提升中的应用。文章分析了医学图像超分辨率在提升诊断信息含量、平衡保真度与临床相关性方面的独特挑战,并详细介绍了如何针对3D体数据特点定制模型架构、设计病理感知损失函数,以及解决高质量配对数据稀缺的策略。通过实战案例,阐述了从数据模拟、模型训练到临床评估的完整流程,旨在为医学影像的清晰化与诊断精准化提供有效解决方案。

weixin_29063681的博客 523

RV1126开发板性能实测:网络、温度与功耗全解析

本文对RV1126开发板进行了全面的性能实测,重点分析了网络性能、温度表现与功耗特性。测试发现UDP带宽可达500Mbps,但TCP性能受限于协议栈;散热设计对持续性能至关重要,大板子在AI推理和视频推流中表现更稳定。为嵌入式开发者提供了真实的选型参考和优化建议。

d3e4f的博客 262

【数据结构】二叉树(c语言)(附源码)

二叉树节点的定义,前序、中序、后序遍历、层序遍历、统计二叉树的节点个数、查找二叉树中元素、判断是否为完全二叉树

2301_80955819的博客 3623

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 153

c语言实现二叉树(源码)

#include <stdio.h> #include <stdlib.h> //定义二叉树的结构 typedef struct binary_tree { int data; // 节点保存的数据 binary_tree* left; // 定义左节点指针 binary_tree* right; // 定义右节点指针 }node; //初始化二叉树 void insert(node** tree, int gain) //指向指针变量的指针,结果...

weixin_44606789的博客 2022

深入C6678启动流程:从BootRom参数表到多核镜像部署的完整解析

本文深入解析TMS320C6678 DSP的启动流程,从BootRom参数表到多核镜像部署的全过程。详细介绍了七种启动模式的工程选择、多核镜像构建技巧以及二级引导策略,帮助开发者掌握C6678的启动机制与调试方法,提升嵌入式系统开发效率。

weixin_30505225的博客 610

Ubuntu 22.04/24.04 安装 ROS2 完整教程(Humble / Jazzy)

最后更新:2026年2月适用系统:Ubuntu 22.04 LTS(Jammy) / Ubuntu 24.04 LTS(Noble)适用架构:x86_64 / arm64(包括树莓派)

2401_84116277的博客 5981

二叉树的代码实现

二叉树(Binary Tree)是n(n≥0)个节点所构成的集合,它或为空树(n=0),或为非空树。对于非空树T: (1)有且仅有一个称之为根的节点; (2)除根节点以外的其余节点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。 二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点: (1)二叉树每个节点至多只有两棵子树(二叉树中不存在度大于2的节点); (2)二叉树的子树有左右之分,其次序不能任意颠倒。 二叉树的递归定义表明二叉树或为空,或由一个根节点加上

荧光百叶草的博客 894

2xmax96717+max96724+agx orin驱动代码

说明:这里主要解决max96717的设备地址和sensor地址映射,vc0->vc1多颗max96717+max96724使用配置思路如下: 1、改变max96717的pipez stream id,然后max96724的pipe绑定使用相应的stream id 2、max96717默认是vc0,把vc0改写成vc1\vc2\vc3,然后max96724再重新映射vc输出

mantouyouyou的博客 112

Java集合源码分析(三):树与二叉树

数组和链表都是用来解决一对一的问题的,而一对多问题则就需要树来解决。这里是为了后续的集合类相关来讲一些基础和概念,如果小伙伴们想更深一步了解的话,可以自己去翻阅相关资料。 首先来看看树的定义吧 一、树的定义 树是N(N>0)个节点的有限集,当N=0是,该树称为空树。 在任意一个非空树中: 1. 有且仅有一个特定的称为根的节点,即根节点。 2. 当N>1时,其余节点可分为M(M>0)个互不相交的有限集T1、T2、T3、…Tm,其中每一个集合本身又是一棵树,并且称为根的子树。 图示: 注:子

不会编程的派大星的博客 214

车载以太网网络测试-24【SOME/IP概述】

SOME/IP**(Scalable Service-Oriented Middleware over IP)是一种基于IP网络的面向服务的通信协议,专为汽车电子系统设计,支持服务发现、远程过程调用(RPC)和事件通知等功能。核心标准是由 AUTOSAR(汽车开放系统架构)定义,现已成为车载通信的重要标准之一(如AUTOSAR 4.0+)。SOME/IP的全称是,它是一种基于IP网络的面向服务的通信协议,广泛应用于汽车电子(AUTOSAR)和物联网领域。Scalable(可扩展的)含义。

车载网络测试工程师的博客 2186

基于ESP32 蓝牙游戏手柄设计

介绍使用 ESP32 并通过 BLE 通信的 设计手持游戏手柄,包含原理图与代码

DT程序员的博客 2163

java 二叉树_Java集合源码分析之基础(三)树与二叉树_一点课堂(多岸学院)...

数组和链表都是用来解决一对一问题的,而一对多问题则需要树来解决。这里,我们重点关注二叉排序树,所以只会介绍一些必需了解的概念,关于树的更多知识,大家可以查看相关书籍进行系统的学习。树的定义树(Tree)是n(n≥0) 个结点的有限集。n=0 时称为空树。在任意一棵非空树中:有且仅有一个特定的称为根(Root)的结点;当n>1 时,其余结点可分为m (m>0) 个互不相交的有限集T1 、...

weixin_39996141的博客 93

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java集合图解源码系列【2】:从二叉树讲到TreeMap,一篇搞明白树的数据结构

大家好!我是未来村村长,就是那个“请你跟我这样做,我就跟你这样做!”的村长👨‍🌾!

农夫的码,没有草原 2015

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java基础(三)——集合

java集合第十二章 集合12.1 概念12.2 手动实现一些逻辑结构12.3 Collection12.3.1 Collection12.3.2 Collection系列的集合的遍历12.4 List12.4.1 List概述12.4.2 List的API12.4.3 ListIterator 接口12.4.4 List的实现类们的区别12.4.5 源码分析(1)Vector(2)ArrayList源码分析(3)LinkedList源码分析12.5 Set12.5.1 Set概述12.5.2 实现类的

波仔头的博客 842

Java集合类源码分析汇总

首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 Java集合类源码分析汇总 舟2016-07-16 21:23:482253收藏2 转自:http://www.cnblogs.com/hzmark/archive/2013/01/05/JavaCollectionSum.html Java集合类基础:http://www.cnblogs.com/hzmark/archive/20...

wangzhipeng47的博客 347

【JAVA进阶之集合】史上最完整的Collection以及Map集合底层原理分析、各种情况的选型

Collection集合概述:是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象:多态的方式具体的实现类ArrayListList集合的概述:有序集合,这里的有序指的是存取顺序用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素与Set集合不同,列表通常允许重复的元素List集合的特点:存取有序可以重复。

2301_77358195的博客 1407

【Java基础】023 -- 集合进阶(List、Set、泛型、树)

Java集合进阶,内容包括:集合体系结构、Collecton集合基本介绍、LIst集合、ArrayList集合、LinkedList集合、常见的数据结构、泛型深入、树、Set系列集合、HashSet、LinkedHashSet、TreeSet、综合案例和使用场景、源码分析。

汤姆lazy的优快云博客 3406
上一篇: Java集合源码分析之基础(二):哈希表
下一篇: Java集合源码分析之基础(四):二叉排序树
刀哥谈Java
博客等级 码龄8年 110粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值