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

news2024/11/22 9:03:43

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《速学数据结构》 《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;
}

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

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

相关文章

详细解析“由于找不到msvcp140.dll无法继续执行代码”的原因及解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到某个动态链接库文件&#xff0c;比如msvcp140.dll。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因并找到解决方法是非常重要的。本文将从多个方面分析找不到msvcp140…

买显卡别再只看N、A两家了,这些高性价比I卡也很香

谈起独立显卡&#xff0c;相信不少朋友都会第一时间想起NVIDIA与AMD这两家巨头。然而&#xff0c;除了这两家巨头以外&#xff0c;凭借集显占据全球最高显卡市场份额的英特尔在2021年正式入局了独显市场&#xff0c;并在去年9月的时候公布了Arc A系列显卡阵容&#xff0c;型号从…

Unix进程间通信之简介-总体概述和引子

目录标题 0. 前言1. 概述2. 进程、线程与信息共享3. IPC对象的持续性4. 名字空间5. fork、exec和exit对IPC对象的影响6. 出错处理&#xff1a; 包裹函数7. Unix标准8. 小结 0. 前言 进程间通信这块是学习linux-c编程的关键&#xff0c; 这篇为后续进程间通信技术的引子篇&#…

计算机网络(2):物理层

物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层的作用是要尽可能地屏蔽掉差异&#xff08;硬件设备&#xff0c;传输媒体&#xff0c;通信手段&#xff09;&#xff0c;使物理层上面的数据链…

Python日期范围按旬和整月以及剩余区间拆分

昨天见到了一个比较烧脑的问题&#xff1a; 咋一看可能理解问题比较费劲&#xff0c;可以直接看结果示例&#xff1a; 当然这个结果在原问题上基础上有一定改进&#xff0c;例如将同一天以单个日期的形式展示。 如何解决这个问题呢&#xff1f;大家可以先拿测试用例自己试一下…

Web前端-HTML(表格与表单)

文章目录 1.表格与表单1.1 概述 2.表格 table2.1 表格概述2.2. 创建表格2.3 表格属性2.4. 表头单元格标签th2.5 表格标题caption&#xff08;了解&#xff09;2.6 合并单元格(难点)2.7 总结表格 3. 表单标签(重点)3.1 概述3.2 form表单3.3 input 控件(重点)type 属性value属性值…

算法——动态规划(DP,Dynamic Programming)

一、基础概念 DP的思想&#xff1a; 把问题分成子问题&#xff0c;前面子问题的解决结果被后面的子问题使用DP与分治法的区别&#xff1a; 分治法把问题分成独立的子问题&#xff0c;各个子问题能独立解决 自顶向下DP前面子问题的解决结果被后面的子问题使用&#xff0c;子问题…

基于YOLOv7算法和的高精度实时头盔目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时头盔目标检测系统可用于日常生活中检测与定位工人是否佩戴头盔&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法…

【基于APB总线的DES实现】

基于APB总线的DES实现 本文内容摘要APB介绍仿真结果整体仿真写入数据DES加密部分DES加密读出密文 整体代码 本文内容摘要 本文是设计一个可兼容APB总线的DES加密协处理器&#xff0c;用来将DES加密模块与APB总线进行对接&#xff0c;使总线发送来的数据可以正常写入并进行加密后…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

蓝桥杯time模块常用操作

#导入time模块import time #获取时间戳 start_time time.time () print ( "start_time ", start_time) time .sleep ( 3) end_time time.time () print ( "end_time ", end_time)#计算运行时间 print("运行时间 { :.0f } ".format(end_time …

【springboot】application配置文件(1)

servlet:multipart:max-file-size: 100MBmax-request-size: 100MB 这些配置是关于servlet的&#xff0c;特别是与文件上传相关的部分。具体来说&#xff0c;它们涉及到multipart的处理&#xff0c;这是处理HTTP的multipart/form-data类型请求的方法&#xff0c;通常用于文件上传…

双指针算法(二)

三数之和 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重…

智能优化算法应用:基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于算术优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.算术优化算法4.实验参数设定5.算法结果6.…

Windows11编译x265源码生成Visual Studio工程详细步骤

概述 x265是一款开源符合HEVC标准的编码器&#xff0c;也属于VLC项目之一。 由于x265是开源的&#xff0c;因此它得到了广泛的应用和开发。许多开源项目和商业产品都使用x265进行视频压缩处理。同时&#xff0c;x265也支持多种编程语言和平台&#xff0c;使得开发者可以方便地…

深度学习记录--随机初始化

权重 权重&#xff0c;指的是变量系数w&#xff0c;决定了变量的变化率 它会改变dw&#xff0c;进而改变下一轮的w(改变更新) 神经网络的权重 对于神经网络(含隐藏层) 由于权重的对称性&#xff0c;我们的隐层的神经单元输出始终不变&#xff0c;出现隐藏神经元的对称性 …

Motion Plan软硬约束下的轨迹生成

Motion Plan之轨迹生成代码实现Motion Plan之搜索算法笔记Motion Plan之基于采样的路径规划算法笔记Motion Plan之带动力学约束路径搜索 Motion Plan之轨迹生成笔记Motion Plan之曲线拟合笔记本项目代码&#xff1a;GitHub - liangwq/robot_motion_planing: 移动机器人轨迹生成…

《PySpark大数据分析实战》-14.云服务模式Databricks介绍基本概念

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

C++面向对象(OOP)编程-模板

本文主要讲解C的模板&#xff0c;其中包括模板的分类&#xff0c;函数模板和类模板&#xff0c;以及类模板与友元函数关系引起的几种关系。强调提供代码来搞懂C模板这一泛型编程手段。 目录 1 C模板 2 模板的本质 3 模板分类 4 函数模板 4.1 函数模板定义格式 4.2 函数模…

Android 一分钟使用RecyclerView完美实现瀑布

【免费】安卓RecyclerView瀑布流效果实现资源-CSDN文库 1.WaterfallFlowActivity 主函数代码&#xff1a; package com.example.mytestapplication;import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.widget.Toast;im…