椋鸟数据结构笔记#5:树、二叉树基础

文章目录

          • 树的相关概念
          • 树的表示
        • 二叉树基础
          • 二叉树分类
            • 满二叉树
            • 完全二叉树
          • 二叉树的性质
          • 二叉树的存储结构
            • 顺序存储
            • 链式存储

萌新的学习笔记,写错了恳请斧正。

树是一种非线性的数据结构,它是由 n 个节点组成的一个具有层次关系的数据集合。其大概结构如下图:

在这里插入图片描述

其形状类似于一棵倒挂的树,由此得名。

树的相关概念
  • 节点:树中每一个存储数据的元被称为节点。上方示意图中A~Q都是这棵树的节点。
  • 根节点:根节点没有父节点,是整棵树的最上面的节点,是该树其他所有节点的发源。也就是上面示意图中的A节点。
  • 父节点(双亲节点):就是树中与某节点相连但在其“上方”的节点。比方说,上方示意图中A是BCDEFG的父节点、E是IJ的父节点。
  • 子节点(孩子节点):与父节点相对,就是树中与某节点相连但在其“下方”的节点。比方说,上方示意图中BCDEFG都是A的子节点。
  • 兄弟节点:有相同父节点的节点互为兄弟节点。比方说,上方示意图中B与C互为兄弟节点、P与Q互为兄弟节点。
  • 堂兄弟节点:只要两个节点互不为兄弟节点但处于树的同一层(与根节点的距离相同,则称其为堂兄弟节点。比方说,上方示意图中H与J互为堂兄弟节点。
  • 节点的祖先:一个节点到根节点的唯一路径上所有的节点都是该节点的祖先。比方说,上方示意图中A节点为所有节点的祖先。
  • 节点的子孙:又某一个节点“向下”延伸出来的所有节点都是该节点的子孙。比方说,上方示意图中其他所有节点都是A节点的子孙。
  • 子树:把根节点的一个子节点拿出来,这个节点与其所有子孙再次组成一棵树,这棵树就称为母树(原本的树)的一棵子树。比方说上方示意图中E、I、J、P、Q就构成了母树的一棵子树。注意子树可以只有一个根节点
  • 节点的度:一个节点的子树的个数称为节点的度。比方说,上方示意图中A节点的度为6
  • 树的度:一棵树最大的节点的度就是这棵树的度。比方说,上方示意图中树的度就是A节点的度,为6.
  • 叶节点(终端节点):度为0的节点(没有子节点)就是叶节点。比方说,上方示意图中BCHIKLMNPQ都是叶节点。
  • 分支节点(非终端节点):度不为0的节点(有子节点)就是分支节点。比方说,上方示意图中ADEFGJ都是分支节点。
  • 森林:多颗不相连的树组成森林。
树的表示

树的表示方法有多种,这里介绍较为常用的左孩子右兄弟表示法。这个方法能够让我们方便的向下查找。

我们定义一个结构体作为树的节点:

typedef int TDataType	//树存储的数据类型typedef struct Tree
{TDataType data;struct Tree* lChild;struct Tree* rSibling;
} Tree;

这个结构体中,lChild存储该节点最左边的子节点,rSibling存储与其紧邻的右侧兄弟节点

这样,我们还是以上方示意图为例,为了方便我再次把图片贴出:

在这里插入图片描述

如果我们想通过A节点找到P节点,这时问题就会变的非常简单了,只需要按照如下路线图寻找即可:

lChlid
rSibling*3
lChlid
rSibling
lChild
A
B
E
I
J
P

如果想要子节点也能向上寻找,那还可以再结构体中添加一个成员用于储存父节点。

二叉树基础

二叉树是一种特殊的树结构,其特征为每一个节点都有且只有两个子树或空子树

下方是一个二叉树的示意图(其中2节点的右子树就是空):

在这里插入图片描述

我们还可以更加抽象一点,下图同样也是一个二叉树:

在这里插入图片描述

二叉树分类

有两种特殊的二叉树类型需要我们单独的来看一看,它们是满二叉树完全二叉树

满二叉树

一个二叉树如果每一层的节点数都达到最大,那这就是一个满二叉树,一个 k 层的满二叉树的节点总数是 2k - 1 。

在这里插入图片描述

完全二叉树

完全二叉树的概念看图很好理解,但是用文字描述就比较复杂了。++对于深度为 K 的有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 K 的满二叉树中编号从 1 至 n 的节点一一对应时称之为完全二叉树++{.wavy}。

在这里插入图片描述

二叉树的性质
  1. 一棵非空二叉树的第 i 层上最多有 2i-1 个节点
  2. 深度为 h 的二叉树的最大节点数是 2h - 1
  3. 对任何一棵二叉树,若度为 0 的节点个数为 n0 ,度为 2 的节点个数为 n2 ,那么 n0 = n2 + 1
  4. 具有 n 个节点的满二叉树深度为 log2(n + 1)
  5. 若逐层从左至右给每一个节点编号(根节点编号0),那么对应序号为 i 的节点:
    1. i 的父节点的编号为 ⌊ ( i − 1 ) / 2 ⌋ \lfloor (i-1)/2 \rfloor ⌊(i1)/2 (当 i > 0 i>0 i>0时)
    2. i 的左孩子节点编号为 2 i + 1 2i+1 2i+1(当 2 i + 1 < n 2i+1<n 2i+1<n时)
    3. i 的右孩子节点编号为 2 i + 2 2i+2 2i+2(当 2 i + 2 < n 2i+2<n 2i+2<n时)
二叉树的存储结构

实现二叉树我们一般有两种存储结构,一种是顺序存储,一种是链式存储

顺序存储

顺序存储就是用顺序表(数组)来存储节点,一般来说只适用于完全二叉树

因为对于完全二叉树,我们可以逐层从左至右给节点编号,存储在数组对应位置,再通过二叉树的性质轻易找到其父节点或左右孩子节点。

在这里插入图片描述

如果不是完全二叉树,这样中间就会有大量的空节点,造成空间浪费。

对于这种存储方式,将在下一篇笔记通过堆(一种基于二叉树的数据结构)来实现与细致的讲解。

链式存储

链式存储就是用链表来存储二叉树的节点。一般来说有两种实现,分别是二叉链和三叉链。

二叉链就是链表的每个节点由数据域和左右指针域组成,左右指针分别指向左孩子与右孩子节点。对于一些更复杂的数据结构,我们可能会使用到基于三叉链的二叉树,也就是再增加一个指针指向其父节点。

//Binary Tree 二叉树
typedef int BTDataType;//二叉链
typedef struct BTNode
{struct BTNode* lChild;struct BTNode* rChild;BTDataType data;
} BTNode;//三叉链
typedef struct BTNode
{struct BTNode* lChild;struct BTNode* rChild;struct BTNode* parent;BTDataType data;
} BTNode;

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

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

相关文章

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

基于three-mesh-bvh实现第一人称及第三人称的漫游

基于three-mesh-bvh实现第一人称及第三人称的漫游 简介 这篇文章主要介绍在3d场景中实现第一人称与第三人称切换以及碰撞监测的漫游方案。 人称视角的场景漫游主要需要解决两个问题&#xff0c;人物在场景中的移动和碰撞检测。移动与碰撞功能是所有三维场景首先需要解决的基…

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程&#xff0c;笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC&#xff1a;Objective-C的简称&#xff0c;因为完整的名称过长&#xff0c;后续会经缩写来代替&#xff1b;项目/工程&#xff1a;也称工程&#xff0c;指的是一个A…

【现代控制】倒立摆模型

基础公式 转动惯量&#xff1a; 欧拉拉格朗日等式 倒立摆模型建立 由拉格朗日等式推导出微分方程&#xff1a; 也就是 将zdot移到等式左边&#xff0c;化简得到 展开就是&#xff1a; 系统线性化 法一&#xff1a;雅可比矩阵 法二&#xff1a;小角度假设 化简最终得…

基于8086贪吃蛇游戏系统方恨设计

**单片机设计介绍&#xff0c;基于8086贪吃蛇游戏系统方恨设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的贪吃蛇游戏系统设计是一个结合了微处理器控制、游戏逻辑以及图形显示技术的综合性项目。该系统旨在通过8086微处理器…

学习使用echats因xAxis值过多,可以滚动的柱状图解决方案

学习使用echats因xAxis值过多&#xff0c;可以滚动的柱状图解决方案 效果图柱状图代码关键代码 效果图 柱状图代码 function echarts() {// 基于准备好的dom&#xff0c;初始化echarts实例var myChart echarts.init(document.getElementById(echart4));let xaxisData [1, 2,…

篮球竞赛预约平台的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

LabelConvert: 目标检测和图像分割数据集格式转换工具

LabelConvert LabelConvert是一个目标检测和图像分割的数据集格式转换工具&#xff0c;支持labelme、labelImg与YOLO、VOC和COCO 数据集格式之间的相互转换。 支持的转换格式 安装 pip install label_convert具体使用方法 由于文章篇幅所限&#xff0c;请移步LabelConvert官…

idea 报错 Could not list the contents of folder “ftps

idea 报错 Could not list the contents of folder "ftps 解决方案 这里看到了网上的解决方案&#xff0c;顺便再记录一下。打开 【高级】菜单 - 取消勾选 被动模式。然后点击测试连接&#xff0c;显示连接成功&#xff01; ftp中的主动模式和被动模式 主动模式&…

GS1-全球分类标准

GS1 GS1是一个中立的全球合作平台&#xff0c;汇集行业领袖、政府、监管机构、学术界和协会&#xff0c;共同开发基于标准的解决方案&#xff0c;以应对数据交换的挑战。我们的规模和影响力——遍布 116 个国家/地区的当地会员组织、超过 200 万家用户公司和每天 100 亿笔交易—…

Python中os.environ基本介绍及使用方法

文章目录 python中os.environos.environ简介os.environ进行环境变量的增删改查 python中os.environ的使用详解1. 简介2. key 字段详解2.1 常见 key 字段 3. os.environ.get() 用法4. 环境变量的增删改查和判断是否存在4.1 新增环境变量4.2 更新环境变量4.3 获取环境变量4.4 删除…

基于“遥感+”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作教程

原文链接&#xff1a;基于“遥感”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599633&idx5&sn1398cde523f9c5e036e4d478fc1d3388&chksmfa8207f6cdf58ee0a3a2bf652e7ac5cf65636b05f9e…

[技术笔记] Flash选型之基础知识芯片分类

1、按照接口分类 分为 Serial串口Flash 和 Parallel并口Flash&#xff1b; 市场大量使用Serial Flash&#xff1b;价格便宜&#xff1b;已满足系统对数据读写速度的要求&#xff1b; Serial Flash已经可以代表 NOR Flash&#xff1b; 小知识&#xff1a; 1&#xff09;在…

fastapi学习记录

今天看了点fastap&#xff0c;简单记录下&#xff0c;fastapi是一个python下的后端框架。 参考学习网站菜鸟教程 安装 pip install fastapi pip install "uvicorn[standard]"安装好了以后就可以直接使用&#xff0c;最主要的使用方式就是写接口嘛&#xff0c;get&a…

【软考】-事务与封锁协议

1、事务的四个特性 (操作) 原子性&#xff1a;要么全做&#xff0c;要么全不做。 (数据)一致性&#xff1a;事务发生后数据是一致的&#xff0c;例如银行转账&#xff0c;不会存在 A 账户转出&#xff0c;但是 B 账户没收到的情况。 (执行)隔离性&#xff1a;任一事务的更新…

2024最新软件测试【测试理论+ Unittest 框架】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

Halcon3D倾斜平面矫正至水平面

前言 在相当多的3d检测中&#xff0c;由于各种因素的干扰&#xff0c;我们所检测的平面通常并不是一个水平面&#xff0c;或者被检测的面不是水平面的情况。尤其是在倾斜面的缺陷检测和平面度检测中&#xff0c;使用被测面与拟合基准面进行计算很难做到准确的定位到缺陷的情况…

openinstall携手得到App,为终身学习者升级服务体验

近日&#xff0c;openinstall与知识付费领域头部品牌得到App达成合作。未来经过openinstall先进的渠道来源追踪技术加持&#xff0c;得到App在渠道推广、用户拉起、分享传播等活动中将获得高效的数据分析能力和用户体验优化&#xff0c;进一步构建数据驱动模式&#xff0c;同时…

探寻大数据思想的主要贡献者与核心内容

引言&#xff1a; 在当今数字化时代&#xff0c;大数据已成为企业和科学研究的关键要素。其背后的思想和概念不仅引领了数据处理和分析的革新&#xff0c;也推动了人类对于信息时代的理解与认知。 大数据思想的起源&#xff1a; 在信息爆炸的时代背景下&#xff0c;大数据思…

智能锁也能用上GPT技术了?大扭力电机更配中国门?这家公司再次引领行业

智能锁也能用上GPT技术了&#xff1f;小小智能锁电机&#xff0c;竟然能拉动2.5吨SUV&#xff1f; 今日&#xff0c;中国智能锁领军品牌德施曼在北京举办「2024德施曼创新技术预沟通会」&#xff0c;德施曼技术研发中心总监桑胜伟揭秘了两项行业突破性技术——GPTfinger及龙霆…