【Java】从树形结构到二叉树:一篇搞懂数据结构里的“家族树”

【Java】从树形结构到二叉树:一篇搞懂数据结构里的“家族树”
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述


【前言】

你有没有想过,电脑里的文件分类、通讯录的层级关系,其实都藏着“树”的影子?树形结构是数据结构里最像“现实家族关系”的存在,而二叉树更是其中的“明星选手”——它规则清晰、操作灵活,是很多复杂数据处理的基础。这篇文章会从树形结构的概念入手,一步步拆解二叉树的类型、性质、存储和操作,帮你把这些抽象的结构变成能上手用的知识~

文章目录:

一、树形结构

1.树形结构的概念

树是一种非线性的数据结构,它模拟了自然界中树的结构。树形结构由若干个节点(node)组成,这些节点之间存在明确的层次关系。

树是递归定义的结点的度:⼀个结点含有⼦树的个数称为该结点的度;树的度:⼀棵树中,所有结点度的最⼤值称为树的度;叶⼦结点或终端结点:度为0的结点称为叶结点;双亲结点或⽗结点:指向其他节点的节点孩⼦结点或⼦结点:被其他节点指向的节点根结点:每个树形结构有一个根节点(root),它是树的起点 ;⾮终端结点或分⽀结点:度不为0的结点;兄弟结点:具有相同⽗结点的结点互称为兄弟结点;堂兄弟结点:双亲在同⼀层的结点互为堂兄弟;
在这里插入图片描述

2.树的表示形式

双亲表⽰法,孩⼦表⽰法、孩⼦双亲表⽰法、孩⼦兄弟表⽰法…

classNode{int value;//数据域 Node firstChild;//第一个孩子 Node nextBrother;//下一个兄弟 }
在这里插入图片描述

二、二叉树

1.概念

二叉树是一种非线性数据结构,其中每个节点最多有两棵树,分别称为左子树和右子树。

在这里插入图片描述

2.二叉树类型

二叉树分为两种:满二叉树和完全二叉树

2.1 满二叉树

定义:==每个节点都有0个或2个子节点 ==

特点:没有只有1个子节点的节点

在这里插入图片描述

2.2 完全二叉树

定义:==除最后一层外,所有层都完全填满,且最后一层节点尽可能靠左 ==

应用:常用于堆的实现

在这里插入图片描述

3.二叉树的性质

  • 若规定根结点的层数为1,则⼀棵⾮空⼆叉树的第i层上最多有2^(i-1)个结点(i>0)
  • 若规定只有根结点的⼆叉树的深度为1,则深度为K的⼆叉树的最⼤结点数是(2^k)-1(k>=0)
  • 对任何⼀棵⼆叉树,如果其叶结点个数为n0,度为2的⾮叶结点个数为n2,则有n0=n2+1
  • 具有n个结点的完全⼆叉树的==深度k为log(n+1)==上取整
  • 对于具有n个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的顺序对所有节点从0开始编号,则对于序号为i的结点有:
若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,⽆双亲结点
若2i+1<n,左孩⼦序号:2i+1,否则⽆左孩⼦
若2i+2<n,右孩⼦序号:2i+2,否则⽆右孩⼦

4.二叉树的存储

⼆叉树的存储结构分为:顺序存储和类似于链表的链式存储。
⼆叉树的链式存储是通过⼀个⼀个的节点引⽤起来的,常⻅的表⽰⽅式有⼆叉和三叉表⽰⽅式

//孩子表示法classNode{int val;//数据域Node left;//左孩子的引用Node right;//右孩子的引用}//孩子双亲表示法classNode1{int val;//数据域Node left;//左孩子的引用Node right;//右孩子的引用Node parent;//当前节点的根节点}

5.二叉树的基本操作

5.1手动创建二叉树

publicstaticclassNode{publicchar val;publicNode left;publicNode right;publicNode(char val){this.val = val;}}//根节点publicNodecreatTree(){NodeA=newNode('A');NodeB=newNode('B');NodeC=newNode('C');NodeD=newNode('D');NodeE=newNode('E');NodeF=newNode('F');NodeG=newNode('G');NodeH=newNode('H');A.left =B;A.right =C;B.left =D;B.right =E;E.right =H;C.left =F;C.right =G;returnA;}

5.2 二叉树的遍历

1.前序遍历

访问顺序:根节点 → 左子树 → 右子树

//前序遍历publicvoidpreOrder(Node root){if(root ==null){return;}System.out.println(root.val);preOrder(root.left);preOrder(root.right);}
2.中序遍历

访问顺序:左子树 → 根节点 → 右子树

//中序遍历publicvoidinOrder(Node root){if(root ==null){return;}preOrder(root.left);System.out.println(root.val);preOrder(root.right);}
3.后序遍历

访问顺序:左子树 → 右子树 → 根节点

//后序遍历publicvoidpostOrder(Node root){if(root ==null){return;}preOrder(root.left);preOrder(root.right);System.out.println(root.val);}

5.3 二叉树操作方法实现

//节点个数publicstaticint count =0;//获取节点个数publicvoidsize(Node root){if(root ==null){return;} count++;size(root.left);size(root.right);}//获取节点个数publicintsize2(Node root){if(root ==null){return0;}returnsize2(root.right)+size2(root.left)+1;}//获取叶子节点个数publicintgetleafNodeCount(Node root){if(root ==null){return0;}if(root.left ==null&&root.right ==null){return1;}returngetleafNodeCount(root.left)+getleafNodeCount(root.right);}//获取第k层节点个数publicintgetLevelNodeCount(Node root,int k){if(root ==null){return0;}if(k ==1){return1;}returngetLevelNodeCount(root.left,k-1)+getLevelNodeCount(root.right,k-1);}//获取二叉树高度publicintgetHight(Node root){if(root ==null){return0;}int leftH =getHight(root.left);int rightH =getHight(root.right);returnMath.max(leftH,rightH)+1;}//找val元素是否存在publicNodefind(Node root,char val){if(root ==null){returnnull;}if(root.val != val ){return root;}Node ret =find(root.left,val);if(ret !=null){return ret;}Node ret1 =find(root.right,val);if(ret !=null){return ret1;}returnnull;}}

三、总结

树形结构是一种“一对多”的层级数据组织方式,而二叉树作为它的特殊形式(每个节点最多俩孩子),凭借满二叉树、完全二叉树等细分类型,以及明确的性质(比如节点数和层数的关系),成了实际开发中常用的结构。我们可以用不同方式存储二叉树,也能通过前/中/后序遍历“逛遍”树里的每个节点——掌握这些内容,不仅能理解数据的组织逻辑,也能为后续学更复杂的树结构(比如红黑树)打牢基础。

Read more

Flutter 三方库 shelf_modular 的鸿蒙化适配指南 - 掌控服务器路由资产、精密模块治理实战、鸿蒙级服务端专家

Flutter 三方库 shelf_modular 的鸿蒙化适配指南 - 掌控服务器路由资产、精密模块治理实战、鸿蒙级服务端专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 shelf_modular 的鸿蒙化适配指南 - 掌控服务器路由资产、精密模块治理实战、鸿蒙级服务端专家 在鸿蒙跨平台应用执行高级服务端管理与多维 Shelf 路由资产指控(如构建一个支持全场景秒级交互的鸿蒙大型全量后端服务中枢、处理海量 API Route Payloads 的语义认领或是实现一个具备极致指控能力的资产管理后台路由审计中心)时,如果仅仅依赖官方的基础 Shelf 处理器或者是极其繁琐的手动路由映射,极易在处理“由于模块嵌套导致的资产认领偏移”、“高频服务请求下的认领假死”或“由于多语言环境导致的符号解析冲突死结”时陷入研发代码服务端逻辑崩溃死循环。如果你追求的是一种完全对齐现代模块化标准、支持全量高度可定制路由(Modular-driven Backend)且具备极致指控确定性的方案。今天我们要深度解析的 shelf_modular——一个专注于解决“服务端资产标准化认领与模块化解耦”痛点的顶级工具库,正是帮你打造“鸿蒙超

By Ne0inhk
ICLR 2026中稿工作VLASER: 究竟哪些多模态能力和数据对提升机器人的控制表现最关键?

ICLR 2026中稿工作VLASER: 究竟哪些多模态能力和数据对提升机器人的控制表现最关键?

一、背景和研究动机 在具身智能(Embodied AI)的浪潮中,研究界致力于将强大的视觉-语言模型(VLM)转化为具备机器人操控能力的 Vision-Language-Action (VLA) 模型 。然而,这一转化过程面临着一道巨大的“鸿沟”:上游 VLM 通常依托海量互联网数据预训练,拥有卓越的通用推理能力;而下游 VLA 却需要在具体的物理环境中实现精准的动作控制 。 目前的现状是:即便 VLM 的通用推理能力很强,在迁移至机器人控制任务时,效果往往不如人意 。这引发了一个核心问题:究竟哪些多模态能力和数据对提升机器人的控制表现最关键? 是堆砌更多的通用问答数据,还是专注于特定的域内(机器人第一视角)的多模态推理数据 ? 为解答这一疑问,来自中国科学技术大学、上海人工智能实验室、上海交通大学等机构的研究团队,在 ICLR 2026 发表了最新成果:Vlaser (Vision-Language-Action Model with Synergistic Embodied Reasoning) 。Vlaser

By Ne0inhk

和风天气Home Assistant插件:5分钟打造智能家居天气中心

和风天气Home Assistant插件:5分钟打造智能家居天气中心 【免费下载链接】qweather和风天气 Home Assistant 插件 项目地址: https://gitcode.com/gh_mirrors/qw/qweather 还在为智能家居缺少精准天气数据而烦恼?和风天气Home Assistant插件正是您需要的完美解决方案!这款基于国内领先气象服务的插件,能够将专业的天气信息无缝集成到您的智能家居生态中,让天气真正为您的智慧生活服务。 🚀 项目核心价值:为什么选择这款插件? 和风天气插件不仅仅是简单的天气显示工具,更是智能家居的"气象大脑"。它基于国内权威气象数据源,提供从分钟级降水到7天趋势的全方位预报,让您的家居设备真正"懂天气"。 📥 极速部署指南:5分钟完成安装 第一步:获取插件文件 使用git命令快速下载插件到本地: git clone https://gitcode.com/gh_mirrors/qw/qweather 第二步:

By Ne0inhk
银发浪潮下的智能护理革命:全球老龄化社会护理机器人发展研究

银发浪潮下的智能护理革命:全球老龄化社会护理机器人发展研究

一、全球老龄化态势与护理需求激增 1.1 人口结构剧变下的养老挑战 当前,全球人口结构正经历着深刻变革,老龄化浪潮汹涌来袭。世界卫生组织数据清晰地勾勒出未来的图景:到 2050 年,全球 60 岁以上人口预计将飙升至 21 亿,老龄化率一举突破 25%。这一趋势在部分国家尤为显著,日本、韩国、德国等已深陷超深度老龄化的泥沼,养老问题成为社会发展的沉重负担。 以日本为例,这个高度发达的经济体,如今正面临着老龄化的严峻考验。其 65 岁以上人口占比接近 30%,每三个国民中就有一位老人。在街头巷尾,随处可见步履蹒跚的老人,他们的生活需求成为社会关注的焦点。韩国的老龄化速度同样惊人,从老龄化社会迈向超级老龄化社会仅仅用了短短 16 年,预计到 2050 年,65 岁以上人口占比将突破 40%,社会养老压力与日俱增。 而在我国,养老形势也不容乐观。截至 2024

By Ne0inhk