二叉树的概念|满二叉树与完全二叉树|二叉树的性质|二叉树的存储结构

news2025/1/15 13:08:52

前言

在数据结构中树的用途其实并不大,用得更多的其实是二叉树。所以在本章我们将详细讲解二叉树。

一、二叉树的概念及结构

1、概念

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

  • 或者为空
  • 或者由一个根节点加上两颗(互不相交)别称为左子树和右子树的二叉树组成

2、结构

在这里插入图片描述

如图我们可知,二叉树的特点:

  • 二叉树不存在度大于2的结点。可以理解为是一颗计划生育的树。
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

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

在这里插入图片描述

二、特殊的二叉树

1、斜树

顾名思义,斜树就一定要是斜的,但是往哪边斜也是有区别的:

  • 左斜树:所有的结点都只有左子树的二叉树叫做左斜树。
  • 右斜树:所有的结点都只有右子树的二叉树叫做右斜树。

在这里插入图片描述
如图我们可知斜树的特点:

  • 每一层都只有一个结点,结点的个数与二叉树的深度相同。
  • 斜树的结构与线性表一样

2、满二叉树

一个二叉树,如果每一个层的结点数都达到最大值(即结点的度为2),则这个二叉树就是满二叉树。

在这里插入图片描述

tip:

  • 深度为K的满二叉树有2^k-1个结点
    在这里插入图片描述
  • 非叶子结点的度一定是2
  • 叶子结点只能出现在最下一层
  • 在同样深度的二叉树中,满二叉树的结点数最多,叶子数最多

3、完全二叉树

对于深度为K的,有n个结点的二叉树,按层序编号,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点——对应时称之为完全二叉树。

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树引出来的。

注意:满二叉树 != 完全二叉树,但是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

tip:

  • 完全二叉树前K-1层都是满的,最后一层可能不满,但是最后一层要求从左到右是连续的。
  • 完全二叉树中,N1(结点度为1)要么是1(且该结点只有左孩子,即不存在只有右孩子的情况),要么是0。
  • 深度为K的完全二叉树,节点数量的范围:[2^(K-1), 2 ^k-1]
    在这里插入图片描述
  • 同样节点数的二叉树,完全二叉树的深度最小

三、二叉树的性质

  1. 若规定根节点的层数为1,则一颗非空二叉树的第i层上最多有2^(i-1)个结点。
  2. 若规定根节点的层数为1,则**深度为h的二叉树的最大结点数是2^h-1。
  3. 对任何一颗二叉树,如果度为0其叶结点个数为n0,度为2的分支结点个数为n2,则有n0 = n2 + 1。(度为0的永远比度为2的多一个)
    在这里插入图片描述
  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度h,如下图所示:
    在这里插入图片描述

四、二叉树的存储结构

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

1、顺序存储

顺序结构存储就是使用数组存储, 一般使用数组 只适合表示完全二叉树, 因为不是完全二叉树会有空间的浪费。

在现实的使用中只有堆才会使用数组来存储二叉树,关于堆我们会在后续详细讲解。

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

在这里插入图片描述
tip:

  • 顺序存储,一般是按照层序对所有结点从0开始编号用数组顺序存储。(因为数组的下标从0开始所以从0开始编号)
  • 数组下标体现了结点之间的逻辑关系
    • parent = (child - 1)/ 2
    • leftchild = parent * 2 + 1
    • rightchild = parent * 2 + 2
  • 数组存储表示二叉树只适合完全二叉树,不适合非完全二叉树,因为会浪费很多空间。

2、链式存储

二叉树的链式存储结构是指,用链表来表示一颗二叉树,即用链来指示元素的逻辑关系。

通常的方法是链表中的每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。

链表结构又分为二叉链和三叉链,现在我们学习中一般都是二叉链,后面学到高阶数据结构如红黑树等才会用到三叉链。

在这里插入图片描述
代码示例:

//重命名结点数据域类型
typedef int BTDataType;

//二叉链
struct BinaryTreeNode
{
	struct BinaryTreeNode* _pLeft;//指向当前结点左孩子
	struct BinaryTreeNode* _pRight;//指向当前结点右孩子
	BTDataType _data;//当前结点值域
};

//三叉链
struct BinaryTreeNode
{
	struct BinaryTreeNode* _pParent;//指向当前结点的双亲
	struct BinaryTreeNode* _pLeft;//指向当前结点左孩子
	struct BinaryTreeNode* _pRight;//指向当前结点右孩子
	BTDataType _data;//当前结点值域
};

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

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

相关文章

云计算入门——Linux 命令行入门

云计算入门——Linux 命令行入门 前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 介绍 如今,我们许多人都熟悉计算机(台式机和笔记本电…

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络 SUSE Linux Enterprise Server是企业级Linux系统,适合企业应用。该文档适用于在VMware workstation平台安装SUSE Linux Enterprise Server虚拟机。 1.安装准备 1.1安装平台 Windows…

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一:GPIO输入输出原理二:GPIO基本结构三:GPIO位结构四:GPIO的八种模式道友:相信别人,更要一百倍地相信自己。 (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

docker安装elk(Elasticsearch+logstash+kibana)

1. 安装Docker 如果您还没有安装Docker,请先安装Docker。您可以按照官方文档进行安装:https://docs.docker.com/engine/installation/ 安装 docker-ce [rootk8s-master ~]# yum install docker-ce -y [rootk8s-master ~]# systemctl start docker &am…

力扣● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 跟弓箭题一样的原理:先集体对左边界排序,然后从第1个区间开始,当下一个区间的左边界比该区间的右边界要小的时候,就得去掉这个区间(count),然后应该①直接更新该区间的右边…

Java根据模板文件生成excel文件,同时将excel文件转换成图片

需求 需要将指定数据导出成表格样式的图片&#xff0c;如图 业务拆解 定义一个导出模板将得到的数据填入模板中&#xff0c;生成excel文件将ecxel文件转换成png格式的图片 代码实现 需要引入的依赖 <dependency><groupId>cn.hutool</groupId><artif…

架构篇04-复杂度来源:高性能

文章目录 单机复杂度集群的复杂度小结 从本篇开始&#xff0c;我们一起深入分析架构设计复杂度的 6 个来源&#xff0c;先来聊聊复杂度的来源之一高性能。 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集…

难道说 IT行业的下一个风口是鸿蒙开发吗?

按往年的习俗&#xff0c;在年底之季有很多HC都会缩减&#xff0c;尤其当下各种裁员的情况下&#xff0c;不管你是在哪个传统开发行业&#xff0c; 如&#xff1a;C/C、Java、前端、后端……等多少都会一股互联网寒流的影响。而今年却出现了一个怪现象&#xff0c;有个岗位在这…

AI客服发展现状与展望:期待技术进步带来更优质的服务体验

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始采用AI客服&#xff0c;以提高效率、降低成本。然而&#xff0c;一些用户反映AI客服存在回答不准确、难以理解个性化问题等问题&#xff0c;引发了对智能客服发展现状的关注。 在北京市民邹女士的…

网页设计(六)表格与表格页面布局

一、设计《TF43: 前端的发展与未来》日程表 《TF43: 前端的发展与未来》日程表 文字素材&#xff1a; 前端是互联网技术的重要一环&#xff0c;自上世纪80年代万维网技术创立以来&#xff0c;Web成就了大量成功的商业公司&#xff0c;也诞生了诸多优秀的技术解决方案。因其标…

SimMIM: a Simple Framework for Masked Image Modeling

论文名称&#xff1a;SimMIM: a Simple Framework for Masked Image Modeling 发表时间&#xff1a;CVPR2022 开源地址&#xff1a; 开源代码 作者及组织&#xff1a;Zhenda Xie, Zheng Zhang, Hu Han等&#xff0c;来自清华&#xff0c;微软亚洲研究院。 前言 本文提出一种新…

2024-01-17复盘和总结

今日复盘 今天是我失业的第一天&#xff0c;心里有点难受&#xff0c;但是没办法&#xff0c;生活需要继续。 1.做了什么&#xff1f; 今天早上9点出发&#xff0c;骑电动车去了闵行区的图书馆&#xff0c;在图书馆里优化了简历&#xff0c;把word版的简历变成了pdf版的简历…

import { ArrowRight } from “@element-plus/icons-vue“;

今天下午快被这个问题折磨疯了 虽然知道这个问题怎么产生的 但项目里那个碍眼的红线就是去不掉 后来才发现 这是插件的锅 我的心情 你知道我想要说什么的 想必能看到这篇文章的 也知道这个问题是怎么产生的 vue3ts使用的时候 默认是需要带上文件名的 但是引入el组件时 …

transbigdata笔记:轨迹切片

1 方法介绍 在transbigdata笔记&#xff1a;轨迹停止点和行程提取-CSDN博客中&#xff0c;已经可以把轨迹点拆分成停止点和行程点&#xff0c;但是行程点只有起止位置&#xff0c;不包含行程轨迹信息为了进一步分析车辆的行驶轨迹&#xff0c;需要从每次行程的时间段中提取轨迹…

Apache Doris (六十四): Flink Doris Connector - (1)-源码编译

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. Flink与Doris版本兼容

探索自适应学习在考试培训系统中的优势

近年来&#xff0c;随着互联网的普及和发展&#xff0c;自适应学习作为一种个性化、灵活的学习方式受到越来越多教育工作者的关注。在考试培训系统中引入自适应学习&#xff0c;可以为学生提供更加有效和高效的学习体验。 自适应学习可以根据学生个体的学习特点和水平&#xff…

大文件的断点续传如何实现

断点续传 断点续传是一种数据恢复技术&#xff0c;主要用于在读取或发送数据时&#xff0c;因为网络问题、磁盘问题等原因导致数据传输中断。断点续传技术允许你在已经传输的数据基础上继续传输&#xff0c;从而节省数据传输时间。 断点续传通常用于文件传输过程中&#xff0c;…

Spring Security的使用条件

Spring Security要求使用Java 8或更高版本的运行时环境。 由于Spring Security旨在以自包含的方式运行&#xff0c;因此您无需在Java运行时环境中放置任何特殊的配置文件。特别是&#xff0c;您无需配置特殊的Java认证和授权服务&#xff08;JAAS&#xff09;策略文件&#xf…

OpenHarmony—Docker编译环境

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

工业企业能源管理平台,可以帮助企业解决哪些方面的能源问题?

随着全球工业化进程的加快&#xff0c;工业企业在生产经营过程中消耗的能源也越来越庞大。能源成本的上升和环境保护的压力使得工业企业对能源管理的重要性有了深刻的认识。为了提高能源利用效率、降低能源消耗、减少环境污染&#xff0c;工业企业在能源管理方面迫切需要一套规…