【初阶数据结构】树结构与二叉树的基础概念

news2024/12/23 19:29:15

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发

Hello,米娜桑们,这里是君兮_,今天带来数据结构里的重点内容也是在笔试,面试中的常见考点——树与二叉树,其中二叉树又分为很多种,我们先来讲讲基础的内容带大家一步步入门

二叉树与其遍历

  • 一 树的概念及其结构
    • 1. 树结构中的相关概念
    • 2. 树的表示
  • 二 什么是二叉树?
    • 1 概念
    • 2 特殊的二叉树
    • 3 二叉树的性质
    • 4 二叉树在内存中的存储
      • 顺序存储
      • 链式存储
    • 5 二叉树的遍历
  • 总结

一 树的概念及其结构

在介绍二叉树之前,我们得先知道什么是树结构,以及几个常用的概念

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

1. 树结构中的相关概念

在这里插入图片描述

  • 节点的度
    一个节点含有的子树的个数称为该节点的度; 如上图: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)棵互不相交的树的集合称为森林

2. 树的表示

  • 这里不是本篇博客要讲的重点,就简单介绍一种常用的孩子兄弟表示法
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};

二 什么是二叉树?

1 概念

  • 一棵二叉树是结点的一个有限集合,该集合:

  • 1. 或者为空

  • 2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
    在这里插入图片描述

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

  • 注意:对于任意的二叉树都是由以下几种情况复合而成的:
    在这里插入图片描述

2 特殊的二叉树

  • 下面我们要介绍两种特殊的二叉树,理解并掌握这两种二叉树对我们之后学习的内容也是非常重要的

1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是
说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。

在这里插入图片描述

2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K
的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对
应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

3 二叉树的性质

  • 1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.
  • 2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2^h-1.
  • 3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为n2 ,则有 n2=n0 +1
  • 4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1) . (log2(n+1) 是log以2
    为底的对数)
  • 5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
    于序号为i的结点有:

1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n 无左孩子 一共n个节点且存在数组里
3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n 无右孩子 同上

  • 对于上面的一些结论,基本上都是数学知识,画个二叉树的图结合数学知识自己能很轻易的推出,这里就不浪费笔墨了

4 二叉树在内存中的存储

顺序存储

  • 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储。
  • 需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段
    在这里插入图片描述

链式存储

  • 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在我们才刚入门对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。
typedef struct BinaryTreeNode
{
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
    int val;
}BTNode;

int main()
{
     
    //手动构建
    BTNode* node1 = BuyNode(1);
    BTNode* node2 = BuyNode(2);
    BTNode* node3 = BuyNode(3);
    BTNode* node4 = BuyNode(4);
    BTNode* node5 = BuyNode(5);
    BTNode* node6 = BuyNode(6);
    node1->left = node2;
    node1->right = node4;
    node2->left = node3;
    node4->left = node5;
    node4->right = node6;
    
    return 0;
}
  • 从前面二叉树的定义我们可以看出,二叉树存在空树和非空,当非空时,二叉树是由根节点,根节点的左子树,根节点的右子树组成的
  • 也就是说,二叉树的定义是递归式的,后面我们的遍历等操作都是依据这一特性来进一步实现的

5 二叉树的遍历

由于是第一次提出二叉树的结构,大家对各种概念还不够了解,我们只先讲讲有哪几种遍历方式,具体的实现方式我们放到下一篇博客中讲解

  • 所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础

  • 按照一定的规则,二叉树的遍历大概有以下几种
    1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
    2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
    3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后
    在这里插入图片描述

  • 由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

  • 4.层序遍历
    除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历
    在这里插入图片描述


总结

  • 今天的内容就到这里了,由于是第一篇介绍树状结构的博客,因此只讲了一些基本的概念,但是千万不要因为是概念就不去好好理解它,实际上如果你这些概念掌握的不够熟练,在后面真正运用的时候是很难弄懂的
  • 因此,想弄懂关于树与二叉树这一块内容,得从一开始就熟悉里面的概念,有些文中给出却没有推的结论不妨自己试着推理一下会记得更牢,如果有任何有关的问题,欢迎在评论区提出或者直接私信我,我看到有时间会第一时间回复的

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

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

相关文章

Notion+Zotero+Notero 联动教程(23年9月更新版)

准备 下载Zotero at https://www.zotero.org/ 下载Zotero Connector at https://www.zotero.org/download/connectors 下载Notion at https://www.notion.so/desktop 下载Notero at https://github.com/dvanoni/notero/releases 关系说明 Notion中的 database 与 Zotero 链接…

parse:uParse修复​​版,优化表格,css等,html富文本加载

https://ext.dcloud.net.cn/plugin?id364 自己搞微信小程序遇到的&#xff0c;uniapp 搞得 后台textarea富文本便捷器 录入的客户端显示&#xff0c;试了好几种都不行&#xff0c;尤其是表格图片排版的。

C++使用Boost库加入UDP组播时程序崩溃

程序崩溃情况 本程序运行在Oracle VM VirtualBox虚拟的Ubuntu20.04上 terminate called after throwing an instance of ‘boost::wrapexceptboost::system::system_error’ what(): set_option: No such device 已放弃 (核心已转储) ** C使用Boost库加入组播的代码 #inclu…

计算机视觉的应用15-图片旋转验证码的角度计算模型的应用,解决旋转图片矫正问题

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用15-图片旋转验证码的角度计算模型的应用&#xff0c;解决旋转图片矫正问题&#xff0c;在CV领域&#xff0c;图片旋转验证码的角度计算模型被广泛应用于解决旋转图片矫正问题&#xff0c;有效解决机…

腾讯mini项目-【指标监控服务重构】2023-07-20

今日已办 Trace otelzap &#xff1a;opentelemetry-go-extra/otelzap at main uptrace/opentelemetry-go-extra (github.com) go get github.com/uptrace/opentelemetry-go-extra/otelzap声明 Tracer &#xff0c;一个应用创建一个 Tracer &#xff08;需要从venus中来传来…

OGAI详解:AIStation调度平台如何实现大模型高效长时间持续训练

大模型是当前通用人工智能产业发展创新的核心技术&#xff0c;目前国内已发布的生成式AI模型超过了100个。面向以大模型为核心的生成式AI开发与应用场景&#xff0c;近日浪潮信息发布了大模型智算软件栈OGAI&#xff08;Open GenAI Infra&#xff09;——“元脑生智”&#xff…

【最新面试问题记录持续更新,java,kotlin,android,flutter】

最近找工作&#xff0c;复习了下java相关的知识。发现已经对很多概念模糊了。记录一下。部分是往年面试题重新整理&#xff0c;部分是自己面试遇到的问题。持续更新中~ 目录 java相关1. 面向对象设计原则2. 面向对象的特征是什么3. 重载和重写4. 基本数据类型5. 装箱和拆箱6. …

Java基础-异常处理

文章目录 异常机制的作用异常存在的形式 异常机制的作用 什么是异常&#xff0c;异常的作用&#xff1f;程序在执行的过程中发生了不正常的情况&#xff0c;而这种情况被称之为"异常"。Java语言是很完善的语言&#xff0c;提供了异常的处理方式&#xff1a;Java把异…

这所院校太好考了!地处魔都!不要错过!

一、学校及专业介绍 上海电力大学&#xff08;Shanghai University of Electric Power&#xff09;&#xff0c;位于上海市&#xff0c;是中央与上海市共建、以上海市管理为主的全日制普通高等院校&#xff0c;是教育部首批“卓越工程师教育培养计划”试点院校、上海高水平地方…

STM32单片机—定时器产生PWM波

STM32单片机—PWM波 PWM波概述定时器产生PWM配置CubeMX配置产生PWM波Hal库产生PWM实现呼吸灯程序设计固件库PWM波程序配置及实现 PWM波概述 什么是PWM   PWM简称脉冲宽度调制&#xff0c;即在一个周期内存在不同极性的电平状态。PWM频率   是指一秒钟内从高电平时间在到低…

如何用ATECLOUD芯片测试系统测试电源芯片的振荡频率?

芯片振荡频率常用于数字电路和模拟电路中&#xff0c;它是影响芯片运行速度的重要因素&#xff0c;其大小与内部电容器、电感、晶体等元件的特性有关。一款芯片生产出来后&#xff0c;它的振荡频率大小总是会在固定的范围之内。因此&#xff0c;芯片的振荡测试不仅需要抓取频率…

CANoe-Model Editor无法修改ARXML文件的问题、E2E在SOME/IP通信中的使用问题

1、Model Editor无法修改ARXML文件的问题 在CANoe 15软件版本中,Communication Setup导入arxml文件后,可以在model editor中打开arxml并修改配置。关闭model editor后再打开,可以看到修改的配置被保存了。 但是,当我把arxml文件从Communication Setup中移除后,再导入。此…

云原生Kubernetes:pod进阶之资源管理与探针

目录 一、理论 1.pod的资源限制 2.健康检查&#xff08;探针Probe) 3.示例 二、实验 1.pod的资源限制 2.健康检查&#xff08;探针Probe) 三、问题 1.生成资源报错 2.api版本错误 3.echo N>/proc/sys/vm/drop_caches如何实现清理缓存 四、总结 一、理论 1.pod的…

信息系统项目管理-IT治理与IT审计

IT治理 IT治理起到统筹&#xff0c;评估&#xff0c;指导&#xff0c;监督的作用&#xff1b; 目标包括&#xff1a;与业务目标一致&#xff0c;有效利用信息资源&#xff0c;风险管理 IT治理体系框架具体包括:IT战略目标、IT治理组织、IT治理机制、 IT治理域、IT治理标准和 …

文心一言 VS 讯飞星火 VS chatgpt (93)-- 算法导论9.2 1题

一、用go语言&#xff0c;证明&#xff1a;在 RANDOMIZED-SELECT 中&#xff0c;对长度为0的数组&#xff0c;不会进行递归调用。 文心一言&#xff1a; 在 Go 语言中&#xff0c;我们可以通过实现一个函数来检查数组的长度&#xff0c;如果长度为0&#xff0c;则不进行递归调…

【Docker】华为云服务器安装 Docker 容器

简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机…

MATLAB中islocalmin函数用法

目录 语法 说明 示例 向量中的局部最小值 矩阵行中的最小值 相隔最小值 最小值平台区 突出最小值 islocalmin函数的功能是计算局部最小值。 语法 TF islocalmin(A) TF islocalmin(A,dim) TF islocalmin(___,Name,Value) [TF,P] islocalmin(___) 说明 ​当在 A 的…

C#批量视频处理工具

主要功能&#xff1a; 视频去头去尾。给视频加水印&#xff0c;目前支持一次在不同位置加两个水印。视频画中画画面裁剪 因为搬运&#xff0c;所以需要批量化处理视频去重&#xff0c;抄CRV的作业开发的这个工具&#xff0c;目前我自己还算够用&#xff0c;当然&#xff0c;肯…

什么是无人机倾斜摄影?无人机倾斜摄影测量测绘中的应用有哪些?

无人机倾斜摄影是国际测绘遥感领域近年发展起来的一项高新技术&#xff0c;通过在同一飞行平台上搭载多台传感器&#xff0c;可以同时从垂直、倾斜等不同角度采集影像&#xff0c;获取地面物体更为完整准确的信息。无人机倾斜摄影测量技术以大范围、高精度、高清晰的方式全面感…

SpringMVC-----JSR303以及拦截器

目录 JSR303 什么是JSR303 JSR303的作用 JSR303常用注解 入门使用 拦截器是什么 拦截器的工作原理 拦截器的作用 拦截器的使用 JSR303 什么是JSR303 JSR303是Java为Bean数据合法性校验提供给的标准框架&#xff0c;已经包含在JavaEE6.0中1。 JSR303通过在Bean属性中标…