速学数据结构 | 树 森林 二叉树 的概念详讲篇


在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《速学数据结构》 《C语言进阶篇》

⛺️生活的理想,就是为了理想的生活!

📋 前言

  🌈hello! 各位宝子们大家好啊,关于线性表我们已经在前面更新完了!
  ⛳️今天就来看一下复杂一些的数据结构 “树” 他的应用主要在哪些方面呢?以及结构是什么样的
  📚本期文章收录在《数据结构&算法》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

文章目录

  • 📋 前言
  • 一、什么是树?
    • 1.1 树的注意事项
    • 1.2 树的相关概念
    • 1.3 树的应用场景有那些
  • 二 、二叉树的概念详讲
    • 2.1 特殊的二叉树
          • 满二叉树
          • 完全二叉树
    • 2.2 二叉树的性质
  • 三、二叉树的两种实现方法
    • 3.1 顺序存储实现二叉树
    • 3.2 .链式结构的二叉树实现

一、什么是树?

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

  • 所以他有一个根节点,根结点没有前驱结点。
  • 又因为树的节点除了根节点 外,还有很多子节点而子节点又有很多子节点
  • 所以树是由 递归创建

在这里插入图片描述
可能大家还不是很了解但大家看上面这张图,左边是一棵树,右边就是我们的 多叉树数据结构了;

  • 由树的根节点,加孩子节点。而孩子节点又有很多孩子节点组成的!
  • 所以我们说树是由递归创建的,他们每个部分都是相同的结构

1.1 树的注意事项

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

  • 大家在做选择题的时候一定要注意了

在这里插入图片描述

1.2 树的相关概念

前面我们说了树是由 一个根节点加很多 子孙节点 组成的,那么他们相应的叫法是什么呢?


在这里插入图片描述

  • 结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6

  • 🔥 叶结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I…等结点为叶结点

  • 🔥 非终端结点或分支结点:度不为0的结点; 如上图:D、E、F、G…等结点为分支结点

  • 🔥 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点

  • 🔥 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点

  • 兄弟结点:具有相同父结点的结点互称为兄弟结点; 如上图:B、C是兄弟结点

  • 树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为6

  • 🔥 结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推

  • 🔥 树的高度或深度:树中结点的最大层次; 如上图:树的高度为4

  • 堂兄弟结点:双亲在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点

  • 🔥 结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先

  • 🔥 子孙:以某结点为根的子树中任一结点都称为该结点的子孙。如上图:所有结点都是A的子孙

  • 森林:由m(m>0)棵互不相交的树的集合称为森林;

其中红色标记的是比较重要的概念大家可以重点记一下这些都是选择题经常出现的概念,像树的深度树的层级

  • 计算孩子节点/叶子节点的个数
  • 如果一个树的深度为4 那么他的最大节点个数是多少?

等等这样的题如果不了解这些概念的话是根本做不了的

1.3 树的应用场景有那些

诶不知道大家注意过没有我们的文件夹和树的结构很类似?

  • 由一个根文件组成,里面还有很多子文件夹,和子孙文件夹。

在这里插入图片描述
这里 Linux 的文件目录就是用多叉树实现的。

二 、二叉树的概念详讲

树的概念我们讲解了,但是其实我们应用最广的还是二叉树比如 八大排序里面的 堆排序快速排序 全都应用了树的思想。

  • 这俩总排序方法都是排序中最快的之一

那么什么是二叉树呢? 其实二叉树就是结点的一个有限集合

  • 该集合,要不为空
  • 要不就是由一个根结点加上两棵别称为左子树和右子树的二叉树组成

在这里插入图片描述

  1. 📌 二叉树不存在度大于2的结点
  2. 📌 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

2.1 特殊的二叉树

满二叉树

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

在这里插入图片描述

完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

  • 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

2.2 二叉树的性质

二叉树是什么我们前面了解过了那么二叉树有那些性质是需要我们来了解一下的呢?

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 2 ( i − 1 ) 2^{(i-1)} 2(i1) 个结点.
  2. 若规定根结点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^h-1 2h1.
  3. 对任何一棵二叉树, 如果度为0其叶结点个数为 n 0 n_0 n0, 度为2的分支结点个数为 n 2 n_2 n2,则有 n 0 n_0 n0 n 2 n_2 n2+1
  4. 若规定根结点的层数为1,具有n个结点的满二叉树的深度h= l o g 2 ( n + 1 ) log_2(n+1) log2(n+1). (ps: l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)是log以2为底,n+1为对数)
  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为i的结点有:
    1. 若i>0,i位置结点的双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点
    2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
    3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

三、二叉树的两种实现方法

3.1 顺序存储实现二叉树

好了讲了这么多大家估计也听的很迷糊,不要慌接下来我们就来看一下二叉树的实现来带大家吃下肉:

  • 二叉树的实现有俩总方式:其中顺序存储就是使用数据来进行存储
  • 利用其下标来进行控制左右子树。

🔥 注:一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费
在这里插入图片描述

大家看这个图片一但使用数组来存储普通的二叉树就会造成很大的空间浪费,顺序存储是由数组进行控制的。

  • 左子树就算不使用存储数据也要把空间给空出来

📚 代码演示:

typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;  //存储数据的数组
	int size;		//存储的数据个数
	int capacity;	//二叉树的容量
}HP;

3.2 .链式结构的二叉树实现

二叉树的链式结构就很简单了,我们前面说了利用顺序存储会造成空间的浪费而链式存储的就避免了这种情况和链表一样。

  • 需要了我们就去申请节点,不需要就不申请。
  • 这样就避免了空间的浪费

🔥 注意:上述代码并不是创建二叉树的方式,只是给大家演示一下后面博主会出一篇博文来进行讲解的。
📚 代码演示:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType _data;
	struct BinaryTreeNode* _left;
	struct BinaryTreeNode* _right;
}BTNode;

BTNode* CreatBinaryTree()
{
 BTNode* node1 = BuyNode(1);
 BTNode* node2 = BuyNode(2);
 BTNode* node3 = BuyNode(3);
 BTNode* node4 = BuyNode(4);
 BTNode* node5 = BuyNode(5);
 BTNode* node6 = BuyNode(6);

 node1->_left = node2;
 node1->_right = node4;
 node2->_left = node3;
 node4->_left = node5;
 node4->_right = node6;
 return node1;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;函数原型 2. join() 函数&#xff08;1&#xff09;头文件&#xff08;2&#xff09;函数原型 3. detach() 函数&#xff08;1&#xff09;头…

扫描电镜中的信号-噪声比(SNR)参数如何优化

在扫描电镜&#xff08;SEM&#xff09;中&#xff0c;信号-噪声比&#xff08;SNR&#xff09;的优化对于获得高质量的图像和可靠的数据分析至关重要。以下是一些优化SNR的方法&#xff1a; 选择适当的检测器&#xff1a;SEM通常配备了不同类型的检测器&#xff0c;如二次电子…

紫光展锐T820与飞桨完成I级兼容性测试 助推端侧AI融合创新

近日&#xff0c;紫光展锐高性能5G SoC T820与百度飞桨完成I级兼容性测试&#xff08;基于Paddle Lite工具&#xff09;。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是紫光展锐加入百度“硬件生态共创计划”后的阶段性成果。 本次I级兼容性测试完…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书&#xff0c;它允许一个证书同时保护多个域名&#xff0c;并且不限制域名的类型&#xff0c;可以保护多个域名和子域名&#xff0c;确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢&#xff1f;今天就随S…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型&#xff0c;使用Kaggle开源数据集&#xff0c;旨在提取图片中的用户特征&#xff0c;最终在移…

vue3 使用antd 报错Uncaught TypeError--【已解决】

问题现象 使用最基本的 ant-design-vue 按钮demo 都报错 报错文字如下 Uncaught TypeError: Cannot read properties of undefined (reading value)at ReactiveEffect.fn (ant-design-vue.js?v597f5366:6693:87)at ReactiveEffect.run (chunk-K2VKR2AM.js?v25c381c3:461:…

计算三叉搜索树的高度 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 定义构造三又搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于节点的数加…

网络(九)CanSM及达芬奇配置

【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块-CSDN博客 上链接讲的非常好。 CanSM提供的函数。 C CanSM使用的函数&#xff1a;

当你打开终端并输入命令时会发生什么?(下)

哈喽大家好&#xff0c;我是咸鱼 我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?&#xff08;上&#xff09;》的内容 终端设备是由电传打字机演变过来的&#xff0c;电传打字机通过物理线与大型计算机连接在一块来实现输入输出 如上图&#xff0c;分别是二…

【高效开发工具系列】DataGrip入门

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;按键、无源蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示第一种门铃音调&#xff0c;可通过K1键切…

对不起,必须放弃SQL!

尽管SQL很受欢迎&#xff0c;也很成功&#xff0c;但它又总是充斥着种种矛盾。 SQL可能笨拙又冗长&#xff0c;但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时&#xff0c;它可以快如闪电&#xff0c;当查询出错时&#xff0c;它就会慢如…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头&#xff0c;用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到&#xff0c;不同…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架&#xff0c;框架是一个半成品&#xff0c;框架是对常用的功能&#xff0c;基础的代码进行封装的一个工具&#xff0c;这个工具对外提供了一些API&#xff0c;其他的开发者只需要调用框架的接口即可&#xff…

Windows进程机制

进程 进程要做任何事情&#xff0c;必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候&#xff0c;会自动为进程创建第一个线程&#xff0c;这称为主线程&#xff08;…

word文档怎么压缩?超级好用!

当Word文档体积过大时&#xff0c;会遇到传输慢、无法上传等问题&#xff0c;这时候可以通过压缩软件、压缩图片等方式减小Word文档体积&#xff0c;下面就一起来看下具体的操作方法吧。 方法一&#xff1a;嗨格式压缩大师 嗨格式压缩大师是一个专业的压缩软件&#xff0c;可以…

分享10个国内免费的AI绘画工具

谈到 AI 绘画&#xff0c;许多人会联想到 Midjourney、Stable Diffusion、DALLE2 等国外的知名绘画工具。 然而&#xff0c;这些国外的 AI 绘画工具大部分都是付费的&#xff0c;并且需要借助科学上网才能使用。这两个条件让许多人望而却步。 考虑到很多人无法进行科学上网&a…

绿色视角下的高校校园建设及能耗管理

摘 要&#xff1a;2019年住建部发布了《绿色校园评价标准》(GB/T51356—2019)&#xff0c;将创建绿色校园提上了日程。绿色校园建设的目标是践行绿色发展理念&#xff0c;建立生态文明教育工作长效机制。创建绿色校园要从政府、社会、学校三个层面来实施&#xff0c;以加快高校…