【数据结构】二叉树(一)——树和二叉树的概念及结构

在这里插入图片描述

前言:
本篇博客主要了解什么是树,什么是二叉树,以及他们的概念和结构。


文章目录

  • 一、树的概念及结构
    • 1.1 树的基本概念
    • 1.2 树的相关特征
    • 1.3 树的实现
  • 二、二叉树的概念及性质
    • 2.1 二叉树的概念
    • 2.2 二叉树的性质

一、树的概念及结构

1.1 树的基本概念

树(Tree)是一种非线性数据结构,是一种层次结构,其中每个节点都有一个父节点(除了根节点)和零个或多个子节点。

树(Tree)这个数据结构被称为“树”,是因为它的图形结构在形状上类似于自然界中的倒立的树。

考虑一棵真实的树,它有一个主干(树干),从树干上生长出许多分支,这些分支又分支出更小的枝叶,最终形成树冠。整体上,树的形状呈分层的结构,从根部到叶子的路径是有序的。

对比到数据结构中的树,树的根节点相当于树的根部,而节点和边的层次结构形成了树状的分支。这种分层结构反映了树的层次性质,每一层都代表了不同的层次或深度。

在这里插入图片描述
当判断一个数据结构是否是树时,可以考虑以下几个特点:

  1. 有且仅有一个根节点: 树结构只有一个根节点,所有的其他节点都通过边连接到根节点。

  2. 每个节点有零个或多个子节点: 每个节点可以有零个或多个子节点,这些子节点也是树的节点,形成了树的分支结构。

  3. 没有循环: 在树中不能存在环,即不能有从某个节点出发经过若干边回到该节点的路径。

  4. 节点之间是有序的: 树中的节点之间是有序的,即每个节点都有一个特定的位置,而子节点的顺序也是确定的。这个顺序通常是由添加或创建节点的顺序来确定的。

  5. 任意两节点间有唯一路径: 从树的根节点到任意一个节点,都有唯一的路径。

以下是一些非树的例子
在这里插入图片描述


1.2 树的相关特征

在这里插入图片描述

  1. 节点的度: 一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点: 度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点
  3. 非终端节点或分支节点: 度不为0的节点; 如上图:D、E、F、G…等节点为分支节点
  4. 双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点: 具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度: 一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次: 从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度: 树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点: 双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先: 从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙: 以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林: 由m(m>0)棵互不相交的树的集合称为森林;

1.3 树的实现

树有很多种实现方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法
等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

孩子兄弟表示法通常每个节点保存了指向其第一个孩子节点和其右兄弟节点的指针。

//兄弟表示法
struct TreeNode {
    int data; //用于保存节点的数据
    struct TreeNode* firstChild;   //指向第一个孩子节点的指针
    struct TreeNode* rightSibling; //指向右边一个兄弟节点的指针
};

结构图:
在这里插入图片描述
树在生活中有许多的应用:

  1. 文件系统: 文件系统通常以树的形式组织文件和目录。每个目录可以包含文件和子目录,形成了一个层次结构。

  2. 电子游戏中的场景图: 在游戏设计中,场景图常常以树结构表示游戏场景中的对象关系和层次。

  3. 组织结构: 公司或组织的层次结构可以使用树表示。每个节点可能代表一个部门,员工,或者项目。

  4. 决策树: 在机器学习中,决策树用于分类和回归分析,帮助模型做出决策。

  5. 图形学中的场景图: 用于表示3D场景中的对象关系,方便进行渲染和交互。


二、二叉树的概念及性质

2.1 二叉树的概念

二叉树是树的一种特殊情况,其中每个节点最多有两个子节点,分别是左子节点和右子节点。

在这里插入图片描述
从上图可以看出:

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

注意:对于任意的二叉树都是由以下几种情况复合而成的:
在这里插入图片描述


2.2 二叉树的性质

  1. 满二叉树: 如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 k k k,且结点总数是 2 k − 1 2^k-1 2k1 ,则它就是满二叉树。
  2. 完全二叉树: 完全二叉树也是一种特殊的二叉树,它和满二叉树的主要区别在于,除了最后一层,其他层的节点都是紧凑排列的,而且最后一层的节点都尽量靠左排列。如果最后一层的节点没有填满,那么缺失的节点会从左到右依次排列。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

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

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

Z-score 因子的深入思考

最新&#xff08;2024 年 1 月&#xff09;出版的 SC 技术分析&#xff08;Techical Analysis of Stock & Commodities&#xff09;的第 4 条文章给到了 Z-score&#xff0c;原文标题为《Z-score: How to use it in Trading》。今天的笔记&#xff0c;就借此机会&#xff0…

C++线程池的原理(画图)及简单实现+例子(加深理解)

1.为什么线程池会出现&#xff0c;解决什么问题&#xff1f; C线程池&#xff08;ThreadPool&#xff09;的出现主要是为了解决以下几个问题&#xff1a; 1.性能&#xff1a;创建和销毁线程都是相对昂贵的操作&#xff0c;特别是在高并发场景下&#xff0c;频繁地创建和销毁线…

ubuntu18.04安装MySQL

1.安装mysql服务器端 sudo apt-get -y install mysql-server&#xff08;18.04/20.04不会提示输入密码&#xff0c;默认是没有密码&#xff09; 2.安装mysql客户端 sudo apt-get -y install mysql-client3.安装mysql模块 sudo apt-get -y install libmysqlclient-dev4.验证是…

data.TensorDataset解析

data.TensorDataset 是 PyTorch 中的一个类&#xff0c;用于创建一个包含多个张量的数据集。这个类的主要作用是将输入的张量组合成一个数据集&#xff0c;使得在训练过程中可以方便地进行数据加载和迭代。 具体来说&#xff0c;TensorDataset 接受一系列的张量作为输入参数&a…

字符集字符编码

字符集 字符&#xff08;Character&#xff09;是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。而字符集&#xff08;Character set&#xff09;则是多个字符的集合。 简单的说&#xff0c;字符集就规定了某个文字对应的二进制数字存放方式…

springboot整合springbatch批处理

springboot整合springbatch实现批处理 简介项目搭建步骤 简介 项目搭建 参考博客【场景实战】Spring Boot Spring Batch 实现批处理任务&#xff0c;保姆级教程 步骤 1.建表 建表sql CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL C…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

牛客网面试题知识点记录-03

1.题目讲解重写后子类调用父类的方法总结&#xff1a;当子类重写了父类方法A&#xff0c;父类方法直接调用被重写的父类方法后&#xff0c;调用的是子类的重写的父类方法A。 class Test {public static void main(String[] args) {System.out.println(new B().getValue());}st…

Java的并发修改异常

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

【Proteus仿真】【STM32单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检测…

奈奎斯特定理

奈奎斯特定理是通信领域中重要的理论基础之一&#xff0c;它对于数字通信系统中的信号采样和重构具有至关重要的作用。在数字信号处理和通信技术中&#xff0c;奈奎斯特定理的应用不仅具有理论意义&#xff0c;还对通信系统的设计、优化和性能提升起着重要的指导作用。本文将以…

8868体育助力意甲博洛尼亚俱乐部 主帅被评为最佳

博洛尼亚俱乐部是8868体育合作球队之一&#xff0c;本赛季在意甲联赛中表现出色&#xff0c;目前以8胜7平2负的成绩排名第四&#xff0c;积31分。意大利媒体评选出的年度最佳主帅是莫塔&#xff0c;本赛季莫塔率领博洛尼亚连续战胜强敌&#xff0c;目前在意甲积分榜上排名第四&…

进阶学习——Linux系统中重点‘进程’

目录 一、程序和进程的关系 1.程序 2.进程 2.1线程 2.2协程 3.进程与线程的区别 4.总结 4.1延伸 5.进程使用内存的问题 5.1内存泄漏——Memory Leak 5.2内存溢出——Memory Overflow 5.3内存不足——OOM&#xff08;out of memory&#xff09; 5.4进程使用内存出现…

Algorithm-Left Edge算法

算法输入&#xff1a; 多个段&#xff0c;每个段由两个值表示&#xff0c;例如&#xff08;1&#xff0c;3&#xff09; 算法原理&#xff1a; 将多个段按照左边的值排序放到列表中遍历列表&#xff0c;不断选择没有重叠的段&#xff0c;直到列表遍历结束&#xff0c;将选择…

fineBI web组件传参

1、fineBI web组件传参 1.1、 Web组件- FineBI帮助文档 FineBI帮助文档1. 概述1.1 版本FineBI 版本HTML5移动端展现功能变动6.0--V11.0.83web组件适配移动端效果优化6.0.13-web组件支持传递参数 ${过滤组件https://help.fanruan.com/finebi/doc-view-143.html 1.2、自己做的例…

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时&#xff0c;将Excel转为TXT纯文本文件可以提高处理效率。此外&#xff0c;许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件&#xff0c;因此将Excel文件转换为TXT还可以简化数据导入过…

如何读取tif格式文件(基于PIL)

背景介绍 在许多机器学习的任务中&#xff0c;大多数图像类型的训练数据集会以tif的格式储存&#xff0c;在这种情况下&#xff0c;如何读取tif格式的数据就至关重要 tif格式 TIF&#xff08;Tagged Image File Format&#xff09;格式&#xff0c;也被称为TIFF&#xff0c;是…

基于Vue开发的一个仿京东电商购物平台系统(附源码下载)

电商购物平台项目 项目完整源码下载 基于Vue开发的一个仿京东电商购物平台系统 Build Setup # csdn下载该项目源码压缩包 解压重命名为sangpinghui_project# 进入项目目录 cd sangpinghui_project# 安装依赖 npm install# 建议不要直接使用 cnpm 安装以来&#xff0c;会有各…

生成式AI在自动化新时代中重塑RPA

生成式AI的兴起正在推动行业的深刻变革&#xff0c;其与RPA技术的结合&#xff0c;标志着自动化领域新时代的到来。这种创新性结合极大地提升了系统的适应性&#xff0c;同时也推动了高级自动化解决方案的发展&#xff0c;为下一代RPA的诞生奠定了坚实的基础。 核心RPA技术专注…