数据结构初阶-二叉树

 🌈个人主页:羽晨同学

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

二叉树

树概念和结构

树的概念

树是一种非线性的数据结构,它是由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…

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

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

基于开源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 官网下载…

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…

阿里云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…

流量计如何进行校准?

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

Linux信号(保存)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 Linux信号(产生)-CSDN博客&#xff0c;上一个章节我们详细介绍了信号是什么&#xff0c;为什么要有信号&#xff0c;怎样产生信号&#xff0c;以及信号产生的几个问题&#xff0c;这个章节我们将介绍信号的保存。 我们…

嵌入式linux学习之arm开发板移植ssh

1.下载源码 &#xff08;1&#xff09;zlib 下载网址&#xff1a;http://www.zlib.net/fossils/ 教程中版本选择的是: zlib-1.2.11.tar.gz &#xff08;2&#xff09;openssl下载网址&#xff1a;https://www.openssl.org/source/mirror.html 教程中版本选择的是: openssl-1.1…

设计模式-迭代器模式(Iterator)

1. 概念 迭代器模式是一种行为型设计模式&#xff0c;它提供了一种统一的方式来访问集合对象中的元素。迭代器模式的核心思想是将遍历集合的责任封装到一个单独的对象中&#xff0c;这样可以避免暴露集合内部的表示方式。这种模式通常用于提供一种方法来访问一个容器对象中各个…

使用 Docker 部署 Draw.io 在线流程图系统

1&#xff09;介绍 Draw.io GitHub&#xff1a;https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建的文档可以导出到多种网盘或本地。无论是创建流程图、组织结构图…

如何帮助中小企业建立数字化的能力?

中小企业建立数字化的能力&#xff0c;可以从以下几个方面着手&#xff1a; 1、开展数字化评估&#xff1a;中小企业首先需要对自己的数字化基础水平和企业经营管理现状进行评估&#xff0c;这包括了解企业在数字化方面的现有能力和需求&#xff0c;以及内外部转型资源的可用性…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

AI智能客服机器人原来这么好用,企业再不使用就落伍了!

随着人工智能技术的不断成熟&#xff0c;AI智能客服机器人已经变得越来越智能&#xff0c;它们正逐渐成为企业提供客户服务的强大助手。企业若不开始部署这种高效的技术&#xff0c;可能会在竞争中失去先机。下面&#xff0c;让我们来看看AI智能客服机器人为何如此好用&#xf…