当前位置: 首页 > news >正文

树的基本概念及二叉树

目录

一、树的基本概念

(1)树的结点

(2)度

(3)结点层次

(4)树的高度 

树的特点: 

二、二叉树

(1)满二叉树

(2)完全二叉树 

三、二叉树的存储 

(1)顺序存储

(2)链式存储 

四、二叉树的遍历

(1)前序遍历

(2)中序遍历 

 (3)后序遍历

 (4)层序遍历


 

树是一种非线性的数据结构,存储具有“一对多”关系特点元素的一种数据结构。例如:组织架构、图书目录、商品种类、热点搜索词等。

如图所示就是一个 树 ,对数据A来说,和数据C、F有关系;对于数据F来说,和数据H、G有关系。这就是“一对多”的关系。 

将具有“一对多”关系的集合中的数据元素按照树的形式进行存储,整个存储形状在逻辑结构上看,类似于实际生活中倒着的树,所以称这种数据的存储结构称为“树”。

一、树的基本概念

树是一种非线性的数据结构,包含n个结点的有限集合,结点之间具备一对多的逻辑关系,当树的结点n=0时,该树被称为空树。

(1)树的结点

树结构中,存储的每一个数据元素都被称为树的“结点”。

结点又被细分为:根节点、子节点、叶子结点

 如图所示:叶子结点即树的末端结点,属于没有子结点的结点,统一称为叶子结点。

子树:由某个子结点作为根结点组成的树被称为子树。上图中红色部分就是一个子树。

(2)度

对于一个结点,拥有的子树个数(结点有多少分支)称为结点的度

树的度:一颗树的度是树内各结点的度的最大值。

(3)结点层次

从一棵树的根结点开始,根结点所在层为第一层,根结点的子结点所在层为第二层,依次类推

(4)树的高度 

一棵树的高度是树中结点所在的最大层次。树的高度,也被称为树的深度。

树的特点: 

在任意一个非空树中,有以下特点:

1.有且仅有一个根结点

2.一棵树中的任意两个结点,有且仅有唯一的一条路径连通,不存在回路。

3.一棵树如果有n个结点,那么它一定有n-1条边

二、二叉树

二叉树是一种结点的度不大于2的有序树,子结点通常被称为“左孩子结点”和“右孩子结点”。

 如图所示就是一个二叉树

 这个图中树的度为3,所以此树就不是一个二叉树

二叉树又被分为满二叉树完全二叉树 

(1)满二叉树

满二叉树是一种特殊的二叉树,它的所有非叶子节点都存在左右子结点,并且所有的叶子结点都在同一层级

image.png

满二叉树的特点:

(2)完全二叉树 

如果二叉树中,从根结点到倒数第二层,符合满二叉树要求,其叶子结点可以不完全填充,但必须靠从左到右连续分布,这样的二叉树被称为完全二叉树。

image.png

三、二叉树的存储 

(1)顺序存储

顺序存储指的是使用顺序表(数组)存储二叉树。但是顺序存储只适用于完全二叉树。满二叉树也是完全二叉树,所以同样适用。

在顺序存储中,顺序表中的每一个位置仅存储结点的data,不需要存储左右子结点的指针,子结点的索引通过计算父结点下标完成。

如果一个父结点的下标为parentIndex它的左结点下标为:2parentIndex,  右子结点下标为:2parentIndex+1

如果完全二叉树,使用数组顺序存储,可以完全利用数组空间

完全二叉树的顺序存储.png

如果是普通二叉树,使用数组顺序存储,在数组中就会出现空隙,导致内存利用率降低

二叉树的顺序存储.png

//基于数组(顺序存储)的二叉树
public class BinaryTree1<E> {
//	创建一个新的空数组用来存储二叉树private Object[] elementData=null;
//	进行初始化操作public BinaryTree1(E[] elements) {
//		新数组的长度要比放入数据的数组长度大一个,因为新数组中从下标为1开始存储elementData=new Object[elements.length+1];for(int i=0,index=1;i<elements.length;i++,index++) {elementData[index]=elements[i];}}
//	获取指定下标处的元素public E get(int index) {return (E) elementData[index];}//	获取指定下标的左孩子public E left(int index) throws Exception {
//		index<<1  即2倍的index,一个子节点的下标的二倍是他的左孩子结点,如果2倍的index大于等于数组长度则没有左子孩子if((index<<1)>=elementData.length) {throw new Exception("没有左孩子");}return (E) elementData[index<<1];}//	获取指定下标的右孩子public E right(int index) throws Exception {if((index<<1)+1>=elementData.length) {throw new Exception("没有右孩子");}return (E) elementData[(index<<1)+1];}}

(2)链式存储 

二叉树的链式存储依靠指针将各个结点串联起来,不需要连续的存储空间。

每个结点包括3个属性:

  • 数据 Data
  • 左孩子结点指针 Left
  • 右孩子结点 Right

链式存储二叉树.png

//二叉树的链式存储
public class BinaryTree<E> {
//	根节点TreeNode<E> root;public BinaryTree(E val) {root=new TreeNode<E>(val);}
//	结点类static class TreeNode<E>{E data;TreeNode<E> left;TreeNode<E> right;public TreeNode() {}public TreeNode(E val) {this.data=val;}}public TreeNode<E> left(TreeNode<E> parent,E val){TreeNode<E> newNode=new TreeNode<E>(val);parent.left=newNode;return newNode;}public TreeNode<E> right(TreeNode<E> parent,E val){TreeNode<E> newNode=new TreeNode<E>(val);parent.right=newNode;return newNode;}}

四、二叉树的遍历

前序遍历根结点->左子树->右子树
中序遍历左子树->根结点->右子树
后序遍历左子树->右子树->根结点

(1)前序遍历

先序遍历.png

	public static void preOrder(TreeNode root) {if(root==null) {return;}System.out.print(root.data);preOrder(root.left);preOrder(root.right);}

(2)中序遍历 

中序遍历.png

public static void inOrder(TreeNode root) {if(root==null) {return;}inOrder(root.left);System.out.print(root.data);inOrder(root.right);}

 (3)后序遍历

后序遍历.png

public static void postOrder(TreeNode root) {if(root==null) {return;}postOrder(root.left);postOrder(root.right);System.out.print(root.data);}

 (4)层序遍历

层序遍历,就是按二叉树从上到下,从左到右,依次打印每层中每个结点存储的数据

image.png

public static void levelOrder(TreeNode root) {if(root==null) {return;}Queue<TreeNode> queue=new LinkedList<TreeNode>();queue.offer(root);while(true) {TreeNode t=queue.poll();if(t==null) {break;}
//访问当前节点,就用打印表示访问即可System.out.print(t.data);if(t.left!=null) {queue.offer(t.left);}if(t.right!=null) {queue.offer(t.right);}}}

 

相关文章:

树的基本概念及二叉树

目录 一、树的基本概念 &#xff08;1&#xff09;树的结点 &#xff08;2&#xff09;度 &#xff08;3&#xff09;结点层次 &#xff08;4&#xff09;树的高度 树的特点&#xff1a; 二、二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完…...

BUUCTF Basic 解题记录--BUU XXE COURSE

1、XXE漏洞 初步学习&#xff0c;可参考链接&#xff1a; 一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 2、了解了XXE漏洞&#xff0c;用burpsuite获取到的url转发给repeater&#xff0c;修改XML的信息&#xff0c;引入外部实体漏洞&#xff0c;修改发送内容&#xff0c;…...

kotlin:LogKit

看到别人的一个代码&#xff0c;觉得有点意思&#xff0c;就复制过来。 package robatimport android.util.Log import java.util.*object LogKit {private val MIN_STACK_OFFSET 3var defaultTag "LogKit"private val lineSeparator System.getProperty("l…...

yolo_tracking中osnet不支持.pth格式,而model_zoo中仅有.pth

yolo_traking-7.0中REID模块用到了osnet&#xff0c;track.py中模型文件不支持.pth&#xff0c;而model_zoo中仅有.pth&#xff0c;改动代码太麻烦了&#xff0c;网上查到的.pth文件转化为.pt文件都需要读取网络架构&#xff0c;不太可能实现。 读取osnet_x0_25_msmt17.pth发现…...

Tailwind CSS浅析与实操

Tailwind CSS 一、Tailwind CSS简介 What is Tailwind CSS Tailwind CSS| TailwindCSS中文文档 | TailwindCSS中文网官方解释&#xff1a;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。本质上是一个工具集&#xff0c;包含了大量类似 fle…...

Activiti工作流引擎详解与应用

一、简介 Activiti是一个开源的工作流引擎&#xff0c;基于BPMN2.0标准进行流程定义。它可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由Activiti进行管…...

New Journal of Physics:不同机器学习力场特征的准确性测试

文章信息 作者&#xff1a;Ting Han1, Jie Li1, Liping Liu2, Fengyu Li1, * and Lin-Wang Wang2, * 通信单位&#xff1a;内蒙古大学物理科学与技术学院、中国科学院半导体研究所 DOI&#xff1a;10.1088/1367-2630/acf2bb 研究背景 近年来&#xff0c;基于DFT数据的机器学…...

ubuntu22.04 x11窗口环境手势控制

ubuntu22.04 x11窗口环境手势控制 ubuntu x11窗口环境的手势控制并不优秀&#xff0c;我们可以使用touchegg去代替 这个配置过程非常简单&#xff0c;并且可以很容易在一定范围内达到你想到的效果&#xff0c;类比mac的手势控制 关于安装 首先添加源&#xff0c;并安装 sud…...

【ARM CoreLink 系列 4 -- NIC-400 控制器详细介绍】

文章目录 1.1 ARM NIC-400(Network interconnect)1.1.1 NIC-400 系统框图1.1.2 NIC-400 Network Interconnect1.2 NIC-400 特点1.2.1 QoS-400 Advanced Quality of Service1.2.2 QVN-400 QoS Virtual Networks1.2.3 TLX-400 Thin Links1.3 NIC-400 Top1.4 NIC-400 Terminology1…...

【生成模型】解决生成模型面对长尾类型物体时的问题 RE-IMAGEN: RETRIEVAL-AUGMENTED TEXT-TO-IMAGE GENERATOR

介绍 尽管最先进的模型可以生成常见实体的高质量图像&#xff0c;但它们通常难以生成不常见实体的图像&#xff0c;例如“Chortai&#xff08;狗&#xff09;”或“Picarones&#xff08;食物&#xff09;”。为了解决这个问题&#xff0c;我们提出了检索增强文本到图像生成器…...

南美巴西市场最全分析开发攻略,收藏一篇就够了

巴西位于南美洲东部&#xff0c;是南美洲资源最丰富&#xff0c;经济活力和经济实力最强的国家。巴西作为拉丁美洲的出口大国&#xff0c;一直是一个比较有潜力的市场&#xff0c;亦是我国外贸公司和独立外贸人集群的地方。中国长期是巴西主要的合作伙伴&#xff0c;2022年占巴…...

c++中操作符->与 . 的使用与区别

在C中&#xff0c;-> 和 . 是两个不同的成员访问操作符&#xff0c;用于访问类、结构体或联合体的成员。 “->” 操作符&#xff1a; 用于通过指针访问指针所指向对象的成员。当有一个指向对象的指针时&#xff0c;可以使用 -> 操作符来访问该指针所指向对象的成员。…...

golang 编译器 汉化

1、找到左上角file选项&#xff0c;点击选中settings进行单机 2、找到settings中找到plugins选中进行点击 3、再框中输入chinese进行搜索&#xff0c;出结果后找到如下图所示&#xff0c;点击进行安装 4、安装完成后进行重启ide&#xff0c;完美解决...

压缩包系列

1、zip伪加密 一个zip文件由三部分组成&#xff1a;压缩源文件数据区压缩源文件目录区压缩源文件目录结束标志。 伪加密原理&#xff1a;zip伪加密是在文件头中加密标志位做修改&#xff0c;然后在打开时误被识别成加密压缩包。 压缩源文件数据区&#xff1a; 50 4B 03 04&a…...

互联网图片安全风控实战训练营开营!

内容安全风控&#xff0c;即针对互联网产生的海量内容的外部、内部风险做宏观到微观的引导和审核&#xff0c;从内容安全领域帮助企业化解监管风险和社会舆论风险&#xff0c;其核心是识别文本、图片、视频、音频中的有害内容。 由于互联网内容类型繁杂、多如牛毛&#xff0c;加…...

炫酷转换:Java实现Excel转换为图片的方法

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在实际开发过程中&#xff0c;经常会有这样的需求&#xff1a;将Excel表格或特定区域转…...

vue elementui <el-date-picker>日期选择框限制只能选择90天内的日期(包括今天)

之前也写过其他限制日期的语句&#xff0c;感觉用dayjs()的subtract()和add()也挺方便易懂的&#xff0c;以此记录 安装dayjs npm install dayjs --save dayjs().add(value : Number, unit : String); dayjs().add(7, day); //在当前的基础上加7天dayjs().subtract(value : N…...

YOLOv5全新Neck改进:BiSPAN 结构独一无二,为目标检测打造全新融合网络,增强定位信号,对于小目标检测的定位具有重要意义

💡本篇内容:YOLOv5全新Neck改进:BiSPAN 结构升级版,为目标检测打造全新融合网络,增强定位信号,对于小目标检测的定位具有重要意义 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv…...

flutter开发实战-video_player插件播放抖音直播实现(仅限Android端)

flutter开发实战-video_player插件播放抖音直播实现&#xff08;仅限Android端&#xff09; 在之前的开发过程中&#xff0c;遇到video_player播放视频&#xff0c;通过查看video_player插件描述&#xff0c;可以看到video_player在Android端使用exoplayer&#xff0c;在iOS端…...

React组件

一、React组件 函数组件 // 函数组件 // 组件的名称必须首字母大写 // 函数组件必须有返回值 如果不需要渲染任何内容&#xff0c;则返回 null function HelloFn () {return <div>这是我的第一个函数组件!</div> }// 定义类组件 function App () {return (<di…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...