树形结构
树形结构广泛存在于客观世界中,如族谱、目录、社会组织、各种事物的分类等,都可用树形结构表示。树形结构在计算机领域应用广泛,如操作系统中的目录结构;源程序编译时,可用树表示源程序的语法结构;在数据库系统中,树结构也是信息的重要组织形式之一。简单地说,一切具有层次关系或包含关系的问题都可用树形结构描述。
▶1.树的基本概念和特征
图看上去像一棵倒置的树,“树”由此得名。图示法表示树形结构时,通常根在上,叶在下。树的箭头方向总是从上到下,即从父节点指向子节点;因此,可以简单地用连线代替箭头,这是画树形结构时的约定。
一棵树由n(n>0)个元素组成的有限集合,其中每个元素称为节点:树有一个特定的根节点(root);除根节点外,其余节点被分成m(m>0)个互不相交的子集(子树)。
树上任一节点所拥有子树的数量称为该节点的度。图4-26中节点C的度为3,节点B的度为1,节点D、H、F、1、J的度为0。度为0的节点称为叶子或终端节点,度大于0的节点称为非终端节点或分支点。树中节点B是节点D的直接前趋,因此称B为D的父节点,称D为B的孩子或子节点。与父节点相回的节点互称为兄弟,如E、F、G是兄弟节点。一棵树或子树上的任何节点(不包括根本身)称为根的子孙。树中节点的层数(或深度)从根开始算起:根的层数为1,其余节点的层数为双亲节点层数加1。在一棵树中,如果从一个节点出发,按层次自上而下沿着一个个树枝到达另一个节点,则称它们之间存在一条路径,路径的长度等于路径上的节点数减1。森林指若干棵互不相交树的集合,实际上,一棵树去掉根节点后就成为森林。
树是一种“分支层次”结构。所谓“分支”是指树中任一节点的子孙,可以它们所在子树的不同划分成不同的“分支”;所谓“层次”是指树上所有节点,可以按层划分成不同的“层次”。在实际应用中,树中的一个节点可用来存储实际问题中的一个数据元素,而节点之间的逻辑关系往往用来表示数据元素之间的某种重要关系。
例:在3D游戏中,经常把游戏场景组织在一个树结构中,这是为了可以快速判断出游戏的可视区域。其算法思想是:如果当前节点完全不可见,那么它的所有子节点也必然完全不可见;如果当前节点完全可见,那么它的所有子结点也必然完全可见;如果当前节点部分可见,就必须依次判断它的子节点,这是一个递归的算法。
树的基本运算包括建树(CREATE)、树遍历、剪枝(DELETE)、求根(ROOT)、求双亲(PARENT)、求孩子(CHILD)等操作。
▶2.二叉树的存储结构
1)二叉树
二叉树的特点是除了叶以外的节点都有2个子树,如图4-27所示。二叉树的2个子树有左右之分,颠倒左右就是不一样的二叉树了,所以二叉树左右不能随便颠倒。由此还可以推出三叉树、四叉树、五叉树、六叉树等。
2)二叉树的链表存储结构
二叉树有两类存储结构:链式存储结构和顺序存储结构。最常用的是二叉树节点链表存储结构(简称为二叉树链表)。
链表存储结构中,Data称为数据域,用于存储节点中的数据元素,Lchid称为左孩子域,用于存放指向本节点左孩子的指针《简称为左指针);与此类似,Rchid称为右指针;每个二叉树链表还有一个指向根节点的指针,该指针称为根指针。根指针具有标识二叉树链表的作用,对二叉树链表的访问从根指针开始。值得注意的是,二叉树链表中每个存储节点的每个指针域必须有一个值,这个值
或者是指向该节点一个孩子的指针,或者是空标志(null或^)。
二叉树的多数基本运算(如求根、求左右子树等)很容易实现。但求双亲运算(PARENT)比较麻烦,而且时间性能不高。如果在实际问题中需要经常做求双亲运算,则采用二叉树链表为存储结构显然不合适。这时可以采用三叉树链表作为存储结构。
3)二叉树的顺序存储结构
程序设计语言中并没有“树”这种数据类型,因此二叉树的顺序存储结构由一维数组构成,二叉树的节点按次序分别存入数组的各个单元。一维数组的下标就是节点位置指针,每个节点中有一个指向各自父亲节点的数组下标。显然,节点的存储次序很重要,存储次序应能反映节点之间的逻辑关系(父子关系),否则二叉树的运算就难以实现。为了节省查询时间,可以规定儿子的数组下标值大于父亲的数组下标值,而兄弟节点的数组下标值随兄弟从左到右递增。
在顺序存储结构中,由于节点的存储位置就是它的编号(即下标),因此节点之间可通过它们的下标确定关系。如果二叉树不是完全二叉树,就必须将其转化为完全二叉树。可通过在二叉树“残缺”位置上增设“虚节点”的方法,将其转化成一棵完全二叉树。然后对得到的完全二叉树重新按层编号,然后再按编号将各节点存入数组,各个“虚节点”在数组中用空标志△表示。经过变换的顺序存储结构,可以用完全二叉树类似的方法实现二叉树数据结构的基本运算。显然,上述方法解决了非完全二叉树的顺序存储问题,但同时也造成了存储空间的浪费。可见这是一种以空间换取性能的计算思维方式。
▶3.二叉树的遍历
树的遍历是指沿着某条搜索路线,依次对树中每个节点访问一次且仅访问一次。树的遍历方法有广度优先遍历和深度优先遍历。二叉树访问一个节点就是对该节点的数据域进行某种处理,处理内容依具体问题而定。
二叉树由三部分组成:根(N)、左子树(L)和右子树(R)。遍历运算的关键在于访问节点的“次序”,二叉树的遍历可分解成三项子任务:访问根节点;遍历左子树(依次访问左子树的全部节点);遍历右子树(依次访问右子树的全部节点)。树的遍历方法主要有“广度优先遍历”和“深度优先遍历”。通常限定为“先左后右”,这样就减少了一些遍历方法。树的深度优先遍历又可分为前序遍历(NLR,根一左—右),后序遍历(LRN,左—右一根)和中序遍历(LNR,左—根一右),其中中序遍历只有对二叉树才有意义。
A)
相关文章:
树形结构
树形结构广泛存在于客观世界中,如族谱、目录、社会组织、各种事物的分类等,都可用树形结构表示。树形结构在计算机领域应用广泛,如操作系统中的目录结构;源程序编译时,可用树表示源程序的语法结构;在数据库…...
《C++避坑神器·二十四》简单搞懂json文件的读写之根据键值对读写Json
c11 json解析库nlohmann/json.hpp文件整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便。 json.hpp库在文章末尾下载 读写主要有两种方式,第一种根据键值对读写&…...
SQL进阶理论篇(二十一):基于SQLMap的自动化SQL注入
文章目录 简介获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查看heros数据表中的所有字段查询heros表中的英雄信息总结参考文献 简介 从上一小节,可以发现,如果我们编写的代码存在着SQL注入的漏洞,后果…...
xtu oj 1055 整数分类
Description 按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,246,则24的类别数是6&a…...
(2023|CVPR,Corgi,偏移扩散,参数高斯分布,弥合差距)用于文本到图像生成的偏移扩散
Shifted Diffusion for Text-to-image Generation 公众:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 简介 2. 方法 2.1 偏移扩散 3. 实验 3.1 无监督文本到图像生成 3.2 无…...
ACE中为socket增加keepalive策略(windows和linux)
0、现象描述 在国产麒麟系统下,基于ACE的tcp-socket,如果长时间不操作,则会自动切断连接,经测试发现,这个时间的上限为30分钟(几乎不差1秒) 经查看/proc/sys/net/ipv4/tcp_keepalive_time=7200,按说是2小时,但测试发现就是30分钟。索性,就通过程序来动态设置keepaliv…...
前端工程注入版本号
文章目录 一、前言二、webpack三、vite四、最后 一、前言 容器化时代,当页面出现问题时,如果你的新版本有可能已经修复了,那样你再排查它就没有意义了。为什么不一定是最新版本呢?一是可能是缓存作祟,二是可能运维成员…...
Android 10.0 SystemUI禁用长按recent键的分屏功能
1.前言 在10.0的系统产品开发中,系统对于多窗口模式默认会有分屏功能的,但是在某些产品中,需要禁用分屏模式,所以需要在导航栏中 禁用长按recent的分屏模式功能,接下来分析下相关分屏模式的实现 2.SystemUI禁用长按recent键的分屏功能的核心类 frameworks\base\packa…...
自媒体实战篇:作品爆款三要素的使用场景和重要性
作品爆款三要素的使用场景和重要性 什么是爆款三要素 标题 概括视频内容,吸引用户注意封面 吸引眼球,引发作者联想标签 精准分类,有利于平台精准推流优质标题要求 标题就是介绍视频故事内容的一段话,通常分为三段式注册,统称三段式标题好的标题统称是三段式的,即点明故事…...
Hbase的安装配置
注:本文默认已经完成hadoop的下载以及环境配置 1.上传zookeeper和hbase压缩包到指令路径并且解压 (理论上讲,hbase其实内置了zookeeper,我们也可以不另外下载,另外下载的目的在于减少组件间依赖性) cd /home mkir hbase cd /hom…...
VMware17Pro虚拟机安装Linux CentOS 7.9(龙蜥)教程(超详细)
目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装Linux4.1 新建虚拟机4.2 安装操作系统4.2.1 选择 ISO 映像文件4.2.2 开启虚拟机4.2.3 选择语言4.2.4 软件选择4.2.5 禁用KDUMP4.2.6 安装位置配置4.2.7 网络和主机名配置…...
QT trimmed和simplified
trimmed:去除了字符串开头前和结尾后的空白; simplified:去除了字符串开头前和结尾后的空白,以及中间内部的空白字符也去掉(\t,\n,\v,\f,\r和 ) 代码: QString str " 1 2 3 4 5 …...
Ensp dhcp全局地址池(配置命令 + 实例)
使用DHCP的好处:减少管理员的工作量、避免输入错误的可能、避免ip冲突 DHCP报文类型: DHCP DISCOVER:客户端用来寻找DHCP服务器 DHCP OFFER:DHCP服务器用来响应DHCP DISCOVER报文,此报文携带了各种配置信息 DHCP REQUEST:客户端配置请求确…...
spring aop实际开发中怎么用,Spring Boot整合AOP,spring boot加spring mvc一起使用aop,项目中使用aop
前言:本文不介绍 AOP 的基本概念、动态代理方式实现 AOP,以及 Spring 框架去实现 AOP。本文重点介绍 Spring Boot 项目中如何使用 AOP,也就是实际项目开发中如何使用 AOP 去实现相关功能。 如果有需要了解 AOP 的概念、动态代理实现 AOP 的&…...
C语言操作符if语句好习惯 详解分析操作符(详解4)
各位少年: 前言 还记得我们上一章讲过一个比较抽象的代码,它要比较两次都是真的情况下才能打印,那么很显然这样写代码是有弊端的?哪我们C语言之父丹尼斯.里奇,先介绍一下上次拉掉了if语句的好习惯 好再分享一些操作符…...
【什么是泛型,有什么好处】
✅什么是泛型,有什么好处 ✅典型回答✅泛型是如何实现的✅什么是类型擦除?📝C语言对泛型的支持📝泛型擦除的缺点有哪些? ✅对泛型通配符的理解📝泛型中上下界限定符 extends 和 super 有什么区别࿱…...
Stable Diffusion系列(三):网络分类与选择
文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时,为了提升绘图质量,可以多种网络混合使用,可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …...
Twincat中PLC的ST语言编程实现机器人安全交互
在TwinCAT中,使用ST语言(Structured Text)进行PLC编程是一种常见的做法。 机器人接触力超过预设阈值后执行停止动作 为了实现机器人在接触力超过预设阈值后停止动作的功能,你需要编写一段ST语言代码,以检查当前的接触…...
Redis实现日榜|直播间榜单|排行榜|Redis实现日榜01
前言 直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。 在直播间贡献榜中,每个观众都有一个对应的贡献值&#…...
如何使用内网穿透工具实现Java远程连接本地Elasticsearch搜索分析引擎
文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar 内网穿透工具实现Java 远程连接操作本地分布式搜索和数据分析引擎Elasticsearch。 Cpolar内网穿透提供了更高的安全性和隐私保…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
