数据结构之树相关概念的知识铺垫

news2024/9/24 5:22:32

文章目录

  • 前言
  • 1.树的相关介绍
  • 2. 树的表示
  • 3.二叉树概念及结构
  • 4.二叉树的性质
  • 5.二叉树相关概念练习
  • 6.总结

前言

之前对数组结构中线性结构进行了相关的介绍,本文将开始对非线性结构进行相关的介绍,首先介绍的是树,会围绕树的相关概念进行初步的简单讲解。本文主要是知识铺垫,在实现树之前,先了解一些树相关的理论知识。


1.树的相关介绍

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。

在这里插入图片描述
树形结构中,子树之间不能有交集,否则就不是树形结构.子树是不相交的,除了根节点每个节点有且只有一个父节点.


树的相关名词介绍
在这里插入图片描述

节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的为6.

叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点.

非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点.

孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林

关于树的高度和深度没有固定说是从0或者1开始计算的,但是一般都是从1开始算的。


2. 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

因为每个节点既要保存值,也要保存节点之间的关系,所以还是类似和链表一样采用结构体的方式来表示树的节点。但是树不是像链表那样是线性的,树的节点可能指向多个孩子结点,所以就会显得有些麻烦,为了更好的管理这些树节点,于是就有了这种孩子兄弟表示法。

typedef int DataType;
struct Node
{
 struct Node* firstChild1; // 第一个孩子结点
 struct Node* nextBrother; // 指向其下一个兄弟结点
 DataType data; // 结点中的数据域
};

在这里插入图片描述
这个孩子兄弟表示法,我举个简单的例子来帮助理解。假如一对夫妇生先后10个孩子,老大被父母管着照看,然后老二被老大管着,老三被老二管着,以此类推。夫妇只管自己的第一孩子,剩下的都由孩子挨个管理。也就是说每个树节点中只有两个地址域,一个指向第一个孩子,一个指向自己最近的兄弟节点。这样就将每个节点之间的关系给理清了。
Liunx目录就是一个树状结构
在这里插入图片描述


3.二叉树概念及结构

二叉树是树的一种结构,树不只有二叉树这一种结构,还有其他多叉树的结构

一棵二叉树是结点的一个有限集合,该集合:
1. 或者为空
2. 由一个根节点加上两棵分别称为左子树和右子树的二叉树组成

在这里插入图片描述

从上图可以看出:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

注意:对于任意的二叉树都是由以下几种情况复合而成的:

在这里插入图片描述

特殊的二叉树
1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,K,且结点总数是 2^k -1,则它就是满二叉树。
2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述


4.二叉树的性质

1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(k-1)个结点.
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h -1 .
3. 对任何一棵二叉树, 如果度为0的节点个数是n0 , 度为2的分支结点个数为n2 ,则有 n0=n2 +1.
4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log2 (n+1)(是log以2为底,n+1为对数)

关于上述1 2 4性质其实可以很好推导出来
只有满二叉树每层节点都是满的,达到了最多节点数的状态,我们以满二叉树为例。
在这里插入图片描述
第3条我们来验证一下

在这里插入图片描述
第3条如果理解不了,需要记住。这还是一个比较有用的性质。


5.二叉树相关概念练习

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199

这道题是用了性质3 叶子节点就是度为0的节点,199+1=200就是叶子节点的个数。所以选B


2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2

分析一下这道题,如果叶子节点为n1 那么度为2的节点就是n1-1,度为1的节点个数设为n1,在完全二叉树中度为1的节点个数要么为1要么就是为0,这点看可以看图验证,那么也就是说 2n1-1+n1=2n,由此可得这个n1只能是1,也就是说2n1=2n,叶子节点就是n,选A


3.一棵完全二叉树的节点数为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12

简单分析一下,根据数字可得这棵树肯定不是满二叉树了,前k-1层肯定是满的,512最接近531,2^9-1=511,所以只能选B,最后一层有20个节点,度为1的节点没有,只有度为2和度为0的节点。


5.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386

简单分析一下,767个节点是奇数,那么说明度为1的节点为0,只有度为2的节点,设叶子节点为n,那么度为2的节点为n-1,也就是说2n-1=767 n=384,选B.


6.总结

  • 本文对树的相关概念进行了简单讲解,为以后深入学习树做铺垫,这些理论知识要熟记忆.
  • 这些知识点都很简单,接下来我们将开始写代码实现树的相关数据结构了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记住这三个方法,让你的钱越花越多

小狗钱钱 关于作者 本书作者博多•舍费尔&#xff0c;是德国著名的投资 家、企业家、演说家以及畅销书作家。他 人生中曾出现过严重的财务危机&#xff0c;但他凭 着自己的努力&#xff0c;重新获得了财务自甶。这 段经历让他产生了和更多人分享理财知识 的想法&#xff0c;《…

玩以太坊链上项目的必备技能(类型-映射类型-Solidity之旅四)

映射&#xff08;Mapping&#xff09; 说到映射&#xff08;Mapping&#xff09;&#xff0c;有过其它编程语言经验的您&#xff0c;对这是再熟悉不过了。Solidity 中的映射&#xff08;Mapping&#xff09; 与Java的Map、Go里的Map以及javascript的JSON等众多编程语言中的Map…

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

【大数据入门核心技术-ElasticSearch】(一)ElasticSearch介绍

目录 一、什么是Elasticsearch? 二、核心概念 1.倒排索引&#xff08;Inverted Index&#xff09; 2.节点 & 集群&#xff08;Node & Cluster&#xff09; 3.索引&#xff08;Index&#xff09; 4.文档&#xff08;Document&#xff09; 5.类型&#xff08;type…

游戏开发50课 性能优化8

4.2 渲染状态优化 4.2.1 状态缓存 在引擎侧&#xff0c;可以使用状态缓存减少渲染管线的切换。伪代码&#xff1a; class RenderStateCache { public:void InitRenderStates();{for (RenderStateType tRenderStateType.begin; t<RenderStateType.end; i){_renderStateCac…

[附源码]计算机毕业设计基于微信小程序的网络办公系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.3 流控模式【链路】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.3 流控模式【链路】31.3.1 流控模式 - 链路31.3.2 举个栗子31.3.3 总结31 限流规则…

Vite + Vue3 + Electron 创建打包桌面程序、实现进程通信

目录 1. Electron 介绍 2. 使用 Vite 构建 Electron 项目 2.1 创建 Vite 应用&#xff0c;安装 Electron 依赖 2.2 在 vite.config.ts 中&#xff0c;配置 Electron 入口文件 2.3 编写 electron / index.ts 2.3.1 app、BrowserWindow 2.3.2 使用 win.loadURL 加载窗口 /…

Autosar MCAL-GTM之TOM

文章目录前言定时器输出模块&#xff08;TOM&#xff09;TOM产生PWM的原理TOM中断中断使能中断模式中断映射CFG中TOM通道配置TOM Channel EnableTomChDisableOnTgcTriggerTOM Channel EnableTOM Channel OutputTomChOutputDisableOnTgcTrigTomChannelOutputControlTomChannelOu…

【项目_05】tabcontrol的搭建及回显、使用keep-alive缓存页面、移动端适配 | 基于Vue3全家桶

&#x1f4ad;&#x1f4ad; ✨&#xff1a;tabcontrol的搭建及回显、使用keep-alive缓存页面   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 总不能还没努力就向生活妥协吧&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希…

【双向ConvLSTM Network:遥感融合】

D2TNet: A ConvLSTM Network With Dual-Direction Transfer for Pan-Sharpening &#xff08;D2TNet: 双向传输的卷积长短期记忆递归神经网络用于泛锐化&#xff09; 本文提出了一种高效的具有双向传输的卷积长短期记忆递归神经网络&#xff08;convolutional long short-ter…

Java Agent 探针技术

Java 中的 Agent 技术可以让我们无侵入性的去进行代理&#xff0c;最常用于程序调试、热部署、性能诊断分析等场景&#xff0c;现如今比较火热的分布式链路追踪项目Skywalking&#xff0c;就是通过探针技术去捕获日志&#xff0c;将数据上报OAP观察分析平台。 Java Agent 技术简…

Socket编程实现TCP、UDP样例

文章目录一.Socket简介二.Socket实现TCPTCP通信简介使用对象及方法简介代码实现服务端代码客户端代码三.Socket实现UDPUDP通信简介UDP程序的使用步骤代码实现服务端代码客户端代码一.Socket简介 socket套接字是通信的基石&#xff0c;是支持TCP/IP协议的路通信的基本操作单元.…

私企招聘:思特威社会招聘

关于我们 思特威&#xff08;上海&#xff09;电子科技股份有限公司 SmartSens Technology &#xff08;股票简称&#xff1a;思特威&#xff0c;股票代码&#xff1a;688213&#xff09;是一家从事CMOS图像传感器芯片产品研发、设计和销售的高新技术企业&#xff0c;总部设立…

pads logic 生成参考编号带分隔符以及不统计不贴元器件的BOM

1.查看BOM报告 &#xff0c;这里可以通过下面的方法 Step1:点击文件 Step2: 勾选材料清单&#xff0c;然后点击设置 Step3:在弹出的如下窗口&#xff0c;选择剪切板视图 &#xff0c;然后选择全选,然后复制&#xff0c;将数据粘贴到excel表格中即可。 2. 参考编号分隔符 …

以前不知道字节面试难在哪,现在体验到了,被虐的很惨

…(这里省略一些不清楚、不知道、忘记了之类的词藻&#xff0c;保留一丝尊严。) 接下来是关于redis哲学三连“是什么?为什么?怎么用?” 我把肚子里仅有的关于Redis的一滴墨水挤成了三滴&#xff0c;仍然没有给出他想要的。继续追问Redis的数据存储方式&#xff0c;操作方法…

微服务框架 SpringCloud微服务架构 微服务保护 30 初识Sentinel 30.1 雪崩问题及解决方案

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护30 初识Sentinel30.1 雪崩问题及解决方案30.1.1 雪崩问题30.1.2 总结30 初识Sentinel 30.1 雪崩问…

类别不平衡Class-imbalance解决方法

类别不平衡是指分类任务中不同类别的训练样例数目差别很大的情况。 1、扩大数据集 2、欠采样 欠采样&#xff08;under-sampling&#xff09;&#xff1a;对大类的数据样本进行采样来减少该类数据样本的个数&#xff0c;使其与其他类数目接近&#xff0c;然后再进行学习。 随…

第十四届蓝桥杯集训——JavaC组第九篇——位运算符

第十四届蓝桥杯集训——JavaC组第九篇——位运算符 目录 第十四届蓝桥杯集训——JavaC组第九篇——位运算符 值交换 异或值交换 其它位移符号&#xff1a; 这个稍微难度大一些&#xff0c;基础的有【&与、|或、^异或、<<左位移、>>右位移】。 我们一个一个…

游戏开发43课 移动游戏性能优化2

2. 资源优化 病从口入&#xff0c;资源好比是入口&#xff0c;它们若出现问题&#xff0c;会引发一连串性能问题。相反&#xff0c;资源若是优化得好&#xff0c;后面所有章节的性能都可受益。这也是把资源优化的章节提到最前的原因。 2.1 纹理优化 纹理优化的目的是让它们占…