数据结构初阶-二叉树

 🌈个人主页:羽晨同学

💫个人格言:“成为自己未来的主人~”  

二叉树

树概念和结构

树的概念

树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合,把它叫做树是因为它看起来像是一颗倒挂的树,也就是说它是根朝上的,而叶子是朝下的。

  • 有一个特殊节点,称为根节点,根节点没有前驱节点
  • 除了根节点之外,其余节点被分为M(M》0)个互不相交的集合,T1,T2......Tm,其中每一个集合Ti(1<=i<=m)又是一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0个或者多个后继结点。
  • 因此,树是递归定义的

这个就是树的草率定义

注意:树形结构当中,子树之间不能有交集,否则就不是树形结构

子树是不相交的,除了根节点外,每个节点有且仅有一个父节点,一颗N个节点的树有N-1条边。

树的相关概念

节点的度:一个节点含有的子树的个数叫做这个节点的度。

叶节点或终端节点:度为0的节点称为叶节点。

非终端节点或分支节点:度不为0的节点。

双亲节点或者父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点

孩子子节点或者子节点:一个节点含有的子树的根节点称为该节点的子节点。

兄弟节点:具有相同父节点的节点称为兄弟节点

树的度,一颗树中,最大的节点的度称为树的度

节点的层次:从根开始定义,根为第一层,根的子节点称为第二层,以此类推。

树的高度或深度:树中节点的最大层次。

堂兄弟节点:双亲在同一层的节点互为堂兄弟

节点的祖先:从根到该节点所经分支上的所有节点

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

森林,由M(M>0)棵互不相交的树的集合称为树林。

树的表示

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

typedef int DataType;
struct Noode
{struct Node* _firstChild;//第一个孩子节点struct Node* _pNextBrother;//指向其下一个兄弟节点DataType _data;//节点中的数据域
};

二叉树概念和结构

概念

一颗二叉树是节点的有限集合,该集合:

1.或者为空

2.由一个根节点加上两颗别称为左子树和右子树的二叉树组成

 

由上图可以看出,

二叉树不存在度大于二的节点

二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

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

 

特殊的二叉树

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

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

二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

顺序结构:

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费,而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解,二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来只是元素的逻辑关系,通常的方法是链表中每个节点有三个域组成,数据域和左右指针域,左右指针分别用来给出该节点左孩子和右孩子所在的链节点的存储地址,链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链。

typedef int BTDataType;
struct BinaryTreeNode
{struct BinTreeNode* _pLeft;//指向当前节点左孩子struct BinTreeNode* _right;//指向当前节点右孩子BTDataType _data;//当前节点值域
};

 

 

 

 

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

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

相关文章

python--pyQt5 进度条:QProgressBar

https://www.cnblogs.com/itwangqiang/articles/14959401.html https://blog.csdn.net/weixin_43990846/article/details/123880081 进度条用于向用户指示操作的进度&#xff0c;并向他们保证应用程序仍在运行 例 1 import sys from PyQt5.QtWidgets import QApplication, QWi…

【机器学习】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

Webpack-

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

OpenHarmony鸿蒙南向开发案例:【智能加湿器】

样例简介 智能加湿器具有实时监控其所处环境温度、湿度&#xff0c;并通过数字管家设置日程&#xff0c;自动打开加湿器控制湿度功能。显示界面使用DevEco Studio 编写的js应用&#xff0c;具有很好的兼容和移植特性。硬件上采用了带有HDF框架的驱动模型&#xff0c;通过GPIO和…

nodejs在控制台打印艺术字

const figlet require("figlet");figlet("SUCCESS", function (err, data) {if (err) {console.log("Something went wrong...");console.dir(err);return;}console.log(data);}); 参考链接&#xff1a; https://www.npmjs.com/package/figlet…

JetBrains相关的IDE有哪些?

JetBrains是一家成立于2002年的捷克软件开发公司&#xff0c;总部位于捷克的布拉格&#xff0c;同时在俄罗斯的圣彼得堡及美国麻州波士顿等地设有办公室。该公司以其高质量的集成开发环境&#xff08;IDE&#xff09;产品而闻名&#xff0c;这些产品被广泛应用于各种编程语言和…

.net 报错 远程主机强迫关闭了一个现有的连接 问题分析解决

先测试cmd 发现可以ping通地址&#xff1a;证明不是网络问题 postman 报错 Error: Hostname/IP does not match certificates altnames 设置里ssl验证默认开启&#xff0c;把选项关闭&#xff0c;接着就正常了&#xff1a;证明应该是https或ssl 相关通讯出现问题 visual st…

Android studio配置Flutter(看这一篇就够了)

Flutter 是 Google 推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 Flutter 提供了丰富的组件、接口&#xff0c;开发者可以很快地为 Flutter 添加 Native&#…

牛批!大三就冲进腾讯了!最新大厂后端面经面试题

先来唠唠 最近有一些小伙伴都约到了腾讯的面试&#xff0c;今天分享一位成功上岸腾讯的大三同学的面经。 希望可以鼓励到你&#xff01; &#xff08;对了&#xff0c;文末有面经交流群&#xff09; 一面大概持续了45分钟&#xff0c;有35分钟都是在问Go基础相关的知识&…

20240420

docker 使用不添加sudo前缀 确认group&#xff1a; getent group如果没有docker组&#xff1a;sudo groupadd docker添加用户到docker组&#xff1a; sudo usermod -aG docker freja重启docker&#xff1a; sudo systemctl restart docker测试后依旧报错&#xff0c;如果是还是…

基于开源CrashRpt与微软开源Detours技术深度改造的异常捕获库分享

目录 1、异常捕获模块概述 2、为什么需要异常捕获模块&#xff1f; 3、在有些异常的场景下是没有生成dump文件的 4、开源异常捕获库CrashRpt介绍 5、对开源库CrashRpt的改进 C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持…

【图说】VMware Ubuntu22.04 详细安装教程

前言 无论是从事 Linux 开发工作&#xff0c;还是希望电脑运行双系统&#xff0c;VMware 虚拟机都是我们日常工作不可或缺的工具。本章将会重点介绍 VMware 安装流程&#xff0c;以及在 VMware 上如何运行、使用 Ubuntu22.04 系统。 一、VMware 下载安装 1.1 VMware 官网下载…

MySQL--创建,删除,查找,案例

1.数据库的---创建&#xff0c;删除&#xff0c;查找&#xff0c;案例 create database 数据库名称; # 创建一个数据库&#xff0c;所有参数默认 create database 数据库名称 [default chasetutf8mb4] # 创建的同时指定了编码2.drop删除 drop database 数据库名称;3.进入数据库…

TensorFlow文件读取 --TFRecords文件

TFRecords文件 是一种二进制文件&#xff0c;能够很好的利用内存&#xff0c;更方便复制和移动&#xff0c;并且不需要单独的标签文件 使用步骤 1&#xff09;获取数据 2&#xff09;将数据填入到Example协议内存块&#xff08;protocol buffer&#xff09; 3&#xff09;将协…

001-谷粒商城-微服务剖析

1、架构图 还是很强的&#xff0c;该有的都有 2、微服务模块 SpringCloudAlibaba组件包括 SentinelNacosRocketMQSeata 搭配SpringCloudAlibaba组件 OpenFeignGateWayRibbn gateway使用了SpringWebFlux&#xff0c;前几天研究到&#xff0c;为什么springboot不直接使用Spri…

Prometheus 标签动作|action: keep 设置哪些对象需要抓取

标签的作用&#xff1a; 可以基于已有的标签&#xff0c;生成一个标签也可以创建新的标签还可以过滤标签&#xff0c;不想采集哪些哪些标签不要了也可以将其删除 保留或丢弃对象、哪些对象需要抓取 Relabeling 另一个常见的用例就是过滤有标签的对象&#xff0c;keep 或 drop …

阿里云mysql8.0 this is incompatible withsql mode=only full group by

阿里云RDS中mysql5.6升级为8.0后&#xff0c;出现如下问题&#xff1a; ### Error querying database. Cause:java.sql.SQLSyntaxErrorException: Expression #1 of SELECT listis not in GROUP BY clause and contains nonaggregatedcolumn temp.product_id which is not fun…

2024抖店新政策!抖音小店的发展趋势!新手必看!

哈喽~我是电商月月 准备开抖店的新手朋友注意了&#xff0c;最近抖音严查无货源违规商家&#xff0c;还发布了取消新手期的政策&#xff0c;这说明了两点 1. 生态环境正在改变 无规矩不成方圆&#xff0c;违规的都是故意放错类目以及&#xff0c;靠S单非法获得销量&#xff…

JavaScript实现字符串转json对象的方法

在JavaScript中&#xff0c;将字符串转换为JSON对象通常使用JSON.parse()方法。但如果你想要其他方法&#xff0c;这里给出四种不同的方法&#xff1a; 1. 使用JSON.parse() 这是最常见且推荐的方法&#xff0c;它可以将一个格式正确的JSON字符串转换为一个JavaScript对象。 …

流量计如何进行校准?

什么是流量计&#xff1f;流量计是指示被测流量和&#xff08;或&#xff09;在选定的时间间隔内流体总量的仪表。简直研制&#xff0c;流量计是用于测量管道或明渠中流体流量的一种仪表。流量计种类繁多&#xff0c;又分为有差压式流量计、转子流量计、节流式流量计、细缝流量…