数据结构 - 树,初探

ops/2024/10/24 0:25:50/

是一种非线性数据结构,是以分支关系定义的层次结构,因此形态上和自然界中的倒挂的很像,而数据结构根向上叶向下。

在这里插入图片描述

什么是

在这里插入图片描述

01定义

是由n(n>=0)个元素节点组成的有限集合,当n=0时,称为空

对于非空应满足以下要求:

(1)有且仅有一个根节点;

(2)当n>1时,其余节点可分成m(m>=0)个互不相交的有限集合,其中每一个集合本身又是一棵,称为根的子

从定义中我们可以得到以下结论:

1)是分支分层结构;

2)中仅有根节点没有父节点;

3)除根节点外,其余节点有且仅有一个父节点;

4)中每个节点,可以有零个或多个子节点;

5)根节点到任何除自身之外的节点,有且仅有一条路径;

02术语

1、节点相关

根节点中仅存在一个根节点,位于的最顶层,并且其没有父节点;

叶节点:叶节点位于的最末端,其下层没有任何节点。

子节点:某个节点的下层节点,相对于该节点叫做子节点;

父节点:某个节点的上层节点,相对于该节点叫做父节点;

在这里插入图片描述

2、结构相关

深度:从根节点到某一节点所经过的边的个数;根节点为0,其子节点为1,自上而下,以此类推。

高度:从某一节点到其最远叶节点的边数。的高度为根节点的高度,所有叶节点高度0,其父节点为1,自下而上,以此类推。

层次:指节点所在的层级,根节点为第0层,其子节点为第1层,自上而下,以此类推。

在这里插入图片描述

:在一棵中,任何一个以某个节点为根节点的结构。

3、关系相关

兄弟节点:拥有共同的父节点的子节点。

祖先节点:从根节点到该节点的路径上经历的所有节点,除自身外,包括父节点、祖父节点等。

后代节点:该节点的所有下层节点,包括子节点、孙节点等。

4、其他术语

的度:指的宽度,也可以理解为节点的分支数,即节点的直接子节点数量,所有节点中度的最大值被视为的度;

路径和路径长度:从一个节点到另一个节点经历的所有边的序列即为路径,路径上所有边的个数即为路径长度;

森林:指若干棵互不相交的的集合;

03二叉

根据节点个数我们可以把分成两类:二叉和N叉

二叉:每个节点最多有两个子节点的

n叉:每个节点最多有n个子节点的

其中最常用的就是二叉,下面我们来详细聊聊二叉

1、定义

(1)每个节点最多有两个子节点,分别称为左子节点和右子节点;

(2)左右子节点所构成左子和右子也都是二叉

2、性质

(1)任意一颗二叉,若节点数为n,则边的数量为n-1;

(2)在二叉中,第i层最多有2^i个节点;

(3)深度为k的二叉,总节点数最少有2k个节点,最多有2(k+1)-1个节点;

(4)在非空二叉中,如果n0表示叶节点数量,n2表示度为2(即有两个节点)的节点数量,则n0=n2+1;

3、遍历

二叉遍历指按照特定顺序访问二叉中所有节点,常用的遍历方式包括:前序遍历、中序遍历、后序遍历和层次遍历。

前序遍历

访问顺序:根节点->左子->右子

步骤

(1)访问根结点;

(2)前序遍历左子

(3)前序遍历右子

示意图

在这里插入图片描述

中序遍历

访问顺序:左子->根节点->右子

步骤

(1)中序遍历左子

(2)访问根结点;

(3)中序遍历右子

示意图
在这里插入图片描述

后序遍历

访问顺序:左子->右子->根节点

步骤

(1)后序遍历左子

(2)后序遍历右子

(3)访问根结点;

示意图
在这里插入图片描述

层次遍历

访问顺序:第0层->第1层->……->第n层(每层从左至右依次处理)

步骤

(1)初始化:创建一个空队列,将根节点加入队列;

(2)遍历:

当队列不为空时:

从队列中取出一个节点,并访问该节点的值;

如果该节点有左子节点,将左子节点加入队列;

如果该节点有右子节点,将右子节点加入队列;

(3)重复步骤2,直到队列为空;

示意图

在这里插入图片描述

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Planner


http://www.ppmy.cn/ops/127955.html

相关文章

Redis学习笔记:整数集合

概述 整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。它可以保存类型为int16_t、int32_t或者int64_t的整数值&#…

MeshXL: Neural Coordinate Field forGenerative 3D Foundation Models 论文解读

目录 一、概述 二、相关工作 1、3D表示 2、3D生成 3、三维基础模型 三、NeurCF 四、MeshXL 1、流程 2、损失 五、数据集 六、实验 1、模型参数量 2、 不同模型对比 3、Mesh生成的多样性 4、文本或图像到网格的生成 5、纹理生成 一、概述 该论文介绍了一个生成式…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有,个人中心,用户管理,中介管理,房屋信息管理&#xff…

JAVA中线程安全问题

1.线程安全的概念 线程安全是指在多线程环境下,程序能够正确地执行而不会出现数据不一致、资源竞争等问题。 简单来说,如果一个程序在运行时的结果符合我们的预期,那么这个程序就是线程安全的,反之,如果程序运行的结果…

轻松修改Linux虚拟机的IP(含Mac版VMware虚拟机克隆教程)

问题背景 在使用WMware克隆虚拟机时,克隆出来的新虚拟机与源虚拟机的IP和MAC地址均相同,无法正常使用,因此需要手动去修改克隆出来的新虚拟机的IP和MAC地址。这篇文章将介绍如何克隆虚拟机并手动修改IP和MAC地址。(点击导航栏可快…

CollageController

目录 1、 CollageController 1.1、 ReceptionID查询CollageID 退料模态框 1.2、 查询退料明细信息 1.3、 查询退料主信息 CollageController using QXQPS.Models; using QXQPS.Vo; using System; using System.Collections; using System.Collections.Generic; …

C++入门基础知识123—【关于C++ 指针数组】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 指针数组的相关内容! 关于…

使用 cmake 在 x86 系统中为 arm 系统交叉编译程序

原理: 在 x86 系统里使用交叉编译工具链(arm 版 gcc/g)编译程序,然后放在 arm 系统里运行。 arm 版本 使用 lscpu 查看 cpu 架构 版本说明armv732 bitarmv8/arrch6464 bit 安装交叉编译工具链 # 针对 armv7 sudo apt install…