C++数据结构:二叉树之一(数组存储)

news2024/11/25 11:03:12

文章目录

  • 前言
  • 一、二叉树的基本定义
  • 二、二叉树的基本性质
  • 三、二叉树的存储(数组)
  • 总结
    • 原创文章,未经许可,禁止转载


前言

树是一种非线性数据结构,它由若干个节点和边组成。每个节点都有一个值,而边则表示节点之间的关系。树具有层次结构,其中一个节点被称为根节点,它没有父节点。除根节点外,每个节点都有且仅有一个父节点。树的基本性质包括树的深度、高度、度数等。

森林是由若干棵互不相交的树组成的集合。一棵树可以看作是一个仅包含一棵树的森林。

二叉树是一种特殊的树,它的每个节点最多只有两个子节点,分别称为左子节点和右子节点。二叉树是树的一种特殊形式,它具有树的所有基本性质,同时还有一些独特的性质。下图为一个树的结构示意:
在这里插入图片描述
因为B节点的度为3,所以上图是树结构但不是二叉树结构。二叉树在树型数据结构中是非常重要的一部分,很多实际问题抽象后的结构往往是二叉树形式的。


一、二叉树的基本定义

二叉树结构在数学中可以用一个有限的集合来表示。这里我们可以用图形的方式来展示二叉树的结构,如下图所示:

在这里插入图片描述

上图表示了二叉树的基本性质,它每个节点最多有两个子节点,可以称度为2,没有分支节点的4、5、6、7可以称之为叶子节点。1节点没有上一层节点,我们称之为根节点,它没有父节点。2节点的度为2,它是一个分支节点,它也是4、5节点的父节点。上图的二叉树有三层,所以我们称之高度或深度为3。

如上所述,学习二叉树,我们先要明白一些常用的术语:

  • 树的度:树中所有节点的度的最大值。度是指一个节点拥有的子节点的个数,明显二叉树的度为2。
  • 节点的度:一个节点拥有的子节点的个数,同上二叉树的节点度为2。
  • 树的高度:也称深度,树中所有节点的层次的最大值。根节点所在的层定义为第一层,它的子节点所在的层为第二层,以此类推。因此,一棵只有一个节点(即根节点)的树的高度为1,而一棵空树(没有节点)的高度为0。上图的二叉树高度为3。
  • 分支节点:度大于零的节点。
  • 叶子节点:度为零的节点。
  • 空树:没有任何节点的树。
  • 完全二叉树:除叶子节点外,每一层的结点都达到最大个数。就是除叶子节点层外,每一个节点都有2个分支节点。

这些术语有助于我们理解和分析二叉树的性质和操作。

二、二叉树的基本性质

对于二叉树,有很多已证明的特性,其中又有几项比较重要的特性我们一定要明白(以下均在非空二叉树条件下):

  • 第 x 层最多有 2x-1个节点。推而广之,深度为 k 的二叉树最多有2k - 1 个节点。
  • 具有 n 个节点的完全二叉树的深度 k = n/2 。如上图所示,节点数是n=7,所以深度k为7/2=3。(对于C++的整数类型,这个公式是成立的,对于python这种弱类型语言应该描述成7//2)
  • 对于完全二叉数,我们以 i 表示节点序号,如上图,i 从上至下,从左至右编号。那么这个完全二叉树满足以下性质:
  • 1、如果i > 1,那么它的父节点为 i/2 (整除)。
  • 2、于上一点相反,如果一个节点存在分支节点,那么它的左子节点为 2i,右子节点为2i + 1。
  • 3、上一点继续推导可以得出,如果2i > n 那么这个结点没有分支节点,它是一个叶子节点。
  • 如果 2i + 1 > n 那么这个结点没有右分支节点。
  • 如果2i == n,这个二叉树就不是完全二叉树。

为什么要搞这些数学公式呢?因为根据这些特性,我们可以把二叉树的存储简化到一个数组就完成了。我们可以假设任一二叉树为完全二叉树,不存在的节点,我们以-1表示,当然也可以用0表示,根节点我们定义为 1,如此我们可以根据以上性质,在一个数组中存储二叉树,以节点编号为数组下标即可!

它非常的方便!并且父节点、左右子节点都可以根据公式得到,是双向可访问的。继续以上图的完全二叉树为例,我们来看看如何在一个数组中存储这个二叉树:
在这里插入图片描述

三、二叉树的存储(数组)

如上图所示,稍一计算便明白,它符合我们前面所述的特性。这种存储方式简直太方便了。我们只需在不存在的下标填0,这可以在数组生成时同步完成。其它下标填入相应数据即可,最大的优点就是可以随机存取任一个节点,这是采用链式存储所不能办到的,必须遍历。当然它的缺点也明显,如果不是完全二叉树,特别是一些歪脖子树,这种方式很浪费空间,如果数据规模很大,可能难以在内存中找到这么大块的连续空间。
下面我们用代码实现这个存储方式:

#include <iostream>
using namespace std;

const int MAX_SIZE = 100;   //数组最大容量
int tree[MAX_SIZE];         //存储二叉树的数组
int n;                      //节点个数

//前序遍历
void preOrder(int root){
    if (root > n) return;      //超出范围,返回
    cout << tree[root] << " "; //访问根节点
    preOrder(root * 2);        //访问左子树
    preOrder(root * 2 + 1);    //访问右子树
}

//中序遍历
void inOrder(int root){
    if (root > n) return;        //超出范围,返回
    inOrder(root * 2);          //访问左子树
    cout << tree[root] << " ";   //访问根节点
    inOrder(root * 2 + 1);      //访问右子树
}

以上是用了递归遍历的方法,递归遍历是一种简单直观的方法,它利用了递归函数调用自身的特性来遍历树中的节点。非递归遍历则需要使用栈或队列等数据结构来辅助遍历。

至于没给出的后序遍历只是改一下代码的顺序,层序遍历更是只要从1到n遍历数组即可。那真是相当的方便啊~,不过看起来一点二叉树的感觉都没有,作者你是不是在忽悠人啊?哈哈…面向对象的编程就是这么的抽象,心中有树,它就是树。


总结

首先笔者没有忽悠人,这确实是二叉树的存储办法,而且是挺好的一个方法。当然在实际工作中它较少被使用,这种存储方式在工作中可以用于排序二叉树(也称二叉搜索树、有序二叉树)它可以用来实现高效的查找和排序算法,比如堆排序。此外,数组存储二叉树的方式也可以用于实现堆数据结构,如大顶堆和小顶堆,它们常用于实现优先队列等数据结构。

嗯这字数已经够多了,也写累了,链表都写了两篇才完成,二叉树只会更多,下一篇写二叉树的链式存储方式及实用示例。

原创文章,未经许可,禁止转载

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

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

相关文章

2核4G5M性能测评:腾讯云轻量应用服务器CPU内存带宽系统盘

腾讯云轻量应用服务器2核4G5M配置一年168元&#xff0c;三年628元&#xff0c;100%CPU性能&#xff0c;5M带宽下载速度640KB/秒&#xff0c;60GB SSD系统盘&#xff0c;月流量500GB&#xff0c;折合每天16.6GB流量&#xff0c;超出月流量包的流量按照0.8元每GB的支付流量费&…

SuperMap iDesktopX扩展开发之GP算子扩展

作者&#xff1a;dongyx SuperMap iDesktopX是超图研究院推出的一款跨平台的桌面GIS软件&#xff0c;兼容Windows和Linux&#xff0c;同时iDesktopX也采用的是插件式扩展开发框架&#xff0c;支持定制开发。 使用iDesktopX定制开发有以下优势&#xff1a; ⚫ 采用 Swing 图形界…

第五十八天学习记录:C语言进阶:文件操作1

什么是文件 在程序设计中&#xff0c;一般有两种文件&#xff1a;程序文件、数据文件 程序文件 包括源程序文件&#xff08;后缀为.c&#xff09;&#xff0c;目标文件&#xff08;windows环境后缀为.obj&#xff09;&#xff0c;可执行程序&#xff08;windows环境后缀为.e…

TM7707 评估前做的功课

目录 硬件 模拟输入范围 转换速度与有效位数 数字电平匹配 建立时间 基准电压 软件 寄存器 硬件 MCU 3.3V 平台&#xff1b; ADC mclk 2.4576mhz 模拟输入范围 在非缓冲模式下&#xff0c;共模输入范围是从 GND 到 V DD 。模拟输入电压的绝对值处在 GND-30mV 和 …

SAP不停机做client copy ,把800数据覆盖到600,导致在600很多单据创建不出来

不停机做client copy &#xff0c;把800数据覆盖到600&#xff0c;但是因为没有停机&#xff0c;导致在800还在产生单据&#xff0c;以至于600的 number range 不对&#xff0c;很多单据都能保存成功但是查寻不到 涉及到的单据&#xff08;包括但不限于&#xff09; 采购订单 生…

GPT-4 太贵?试试这 6 个免费且优秀的替代方案

大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 目录 AutoGPT - 直接从您的浏览器使用 Bard - Google AI 的免费工具。 Bing - New Bing 已经支持GPT-4&#xff0c; Claude - Anthropic对标ChatGPT Hugging…

适合每个人的热门CSS工具

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

Jenkins+Gogs自动远程Docker环境部署django项目

1.Jenkins安装或确认必要插件 jenkins安装或确认必要插件gitlab、Publish Over SSH。 Dashboard--Manage Jenkins--Plugin Manager 2.Publish Over SSH配置 jenkins配置SSH连接django服务部署的对象服务器 Dashboard--Manage Jenkins--Configure System&#xff0c;找到 Publ…

LIS和LIMS有什么区别?

术语“实验室信息系统”&#xff08;LIS&#xff09;和“实验室信息管理系统”&#xff08;LIMS&#xff09;经常会引起混淆&#xff0c;并且倾向于互换使用这些术语。通常&#xff0c;术语“ LIS”是指用于管理医院或医疗环境中的临床诊断测试的系统。另一方面&#xff0c;LIM…

基于C#的串口扫描枪通信实战

今天搞大事&#xff0c;观众们动起来&#xff0c;搞事的目的是 掌握串口通信及winform开发技术 硬件设备&#xff1a;1、串口激光扫描枪&#xff0c;注意是串口&#xff0c;不是USB口 2、USB转串口的连接线一根&#xff0c;如图连接所示 3、USB扩展器一个&#xff0c;如果你电…

图片优化: CssSprites与Base64编码

文章目录 1 css sprites1.1 CSS Sprites是什么1.2 为什么需要css sprites1.3 优势1.4 使用原理 2 图片Base64编码 1 css sprites 1.1 CSS Sprites是什么 CSS Sprites是一种网页图片应用处理方式。 又被解释为&#xff1a; CSS精灵CSS图像拼合CSS贴图定位CSS图片精灵CSS雪碧图…

快六一啦,学习CSS3实现一个冰淇淋动画特效

快六一啦&#xff0c;小时候顶多吃个小冰棍&#xff0c;或者是那种小冰袋&#xff0c;现在的小朋友真是好&#xff0c;动不动就能吃到冰淇淋&#xff0c;今天用CSS3实现一个冰淇淋的动画特效吧 目录 实现思路 桶身的实现 冰淇淋身体的实现 五彩颗粒的实现 HTML源码 CSS3源…

17 张程序员专属壁纸推荐

1、三思后再写代码&#xff01;&#xff01;&#xff01; 2、从世界上搜索喜欢你的人&#xff01;&#xff01;&#xff01; 3、代码没写完&#xff0c;哪里有脸睡觉&#xff01;&#xff01;&#xff01; 4、程序员的 Home 键&#xff01;&#xff01;&#xff01; 5、编程是…

【完整项目开发】Springboot+vue教学材料管理系统定制开发

Springbootvue 的专业建建设材料管理系统。 **大家好&#xff0c;今天分享最近做的一套系统。**起因源于小伙伴的需求 文末有的获取方式&#xff0c;如需定制系统&#xff0c;需求发来&#xff0c;我为你分忧&#xff0c;搞起 一、 项目介绍 基于各个专业&#xff0c;对教…

代码随想录算法训练营day56 | 583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇

代码随想录算法训练营day56 | 583. 两个字符串的删除操作&#xff0c;72. 编辑距离&#xff0c;编辑距离总结篇 583. 两个字符串的删除操作解法一&#xff1a;动态规划解法二&#xff1a;计算最长公共子序列&#xff0c;然后用数组长度减掉子序列长度 72. 编辑距离解法一&#…

界面组件DevExpress ASP.NET Core v22.2 - UI组件升级

DevExpress ASP.NET Core Controls使用强大的混合方法&#xff0c;结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性&#xff0c;提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

【操作系统】01.操作系统概论

操作系统的发展历史 未配置操作系统 手工操作阶段 用户独占全机&#xff0c;人机速度矛盾导致系统资源利用率低 脱机输入输出方式 为了缓解主机cpu和IO设备之间速度不匹配的矛盾&#xff0c;出现了脱机IO技术 在外围机的控制下&#xff0c;通过输入设备&#xff0c;将数据输…

Spring事务和事务的传播机制

一、为什么需要事务 1.1事务定义 将一组操作封装成一个执行单元&#xff0c;要么全部成功要么全部失败。 1.2为什么要用事物 例如转账分为两个操作&#xff1a; 第⼀步操作&#xff1a;A 账户 -100 元。第⼆步操作&#xff1a;B 账户 100 元。 如果没有事务&#xff0c;第…

脱岗监测预警系统 yolov5

脱岗监测预警系统可以通过pythonyolov5网络模型深度学习算法&#xff0c;脱岗监测预警算法对现场人员岗位进行实时监测&#xff0c;自动识别是否存在脱岗行为&#xff0c;并及时发出警报。Yolo意思是You Only Look Once&#xff0c;它并没有真正的去掉候选区域&#xff0c;而是…

2023安卓逆向 -- 抓包环境设置(Charles+Postern)

一、下载Charles并设置代理 1、下载地址&#xff0c;一路下一步即可安装 https://www.charlesproxy.com/ 2、代理设置&#xff0c;抓取所有ip及所有端口的数据包&#xff0c;点击Proxy&#xff0c;选择SSL Proxying Settings 3、点击Add&#xff0c;Host和Port都填写*&#x…