【数据结构从0到1之树的初识】

news2024/11/9 2:12:41

目录

1.树的表达方式

1.1 树的定义

1.2树的相关概念

1.3树的存储结构

1.3.1 双亲表示法

1.3.2 孩子表示法

1.3.3 孩子兄弟表示法

1.4树在实际中的应用

后记:

 

🕺作者: 迷茫的启明星

😘欢迎关注:👍点赞🙌收藏✍️留言

🎃系列专栏:

                        🛫 《C语言从0到1专栏》

                        🛫《数据结构从0到1专栏》

                        🛫 《C语言杂谈》

                        🛫《数据库》
🏇家人们,码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢观看!!!

持续更新中~


 

1.树的表达方式

集合中的元素关系呈现出一对多的情况

 

1.1 树的定义

  • 树(Tree)是n(n≥0)个节点的有限集合T,它满足两个条件 :

    • 有且仅有一个特定的称为根(Root)的节点

    • 其余的节点可以分为m(m≥0)个互不相交的有限集合T1、T2、……、Tm,其中每一个集合又是一棵树,并称为其根的子树(Subtree)。

       

  • 树的定义具有 递归性,即“树中还有树”。

1.2树的相关概念

 

  • 节点的度:一个节点含有的子树的个数称为该节点的度;

    • 如上图:A的为6

  • 叶节点或终端节点:度为0的节点称为叶节点;

    • 如上图:B、C、H、I...等节点为叶节点

  • 非终端节点或分支节点:度不为0的节点;

    • 如上图:D、E、F、G...等节点为分支节点

  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

    • 如上图:A是B的父节点

  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

    • 如上图:B是A的孩子节点

  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;

    • 如上图:B、C是兄弟节点

  • 树的度:一棵树中,最大的节点的度称为树的度;

    • 如上图:树的度为6

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

  • 树的高度或深度:树中节点的最大层次;

    • 如上图:树的高度为4

  • 节点的祖先:从根到该节点所经分支上的所有节点;

    • 如上图:A是所有节点的祖先

  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

    • 如上图:所有节点都是A的子孙

  • 森林:由m(m>0)棵互不相交的多颗树的集合称为森林;(数据结构中的学习并查集本质就是一个森林)

1.3树的存储结构

1.3.1 双亲表示法

 

概念:

  • 双亲表示法采⽤顺序表(也就是数组)存储普通树

  • 其实现的核心思想是:顺序存储各个节点的同时,给各节点附加一个记录其⽗节点位置的变量

  • 根节点没有⽗节点(⽗节点又称为双亲节点),因此根节点记录⽗节点位置的变量通常置为 -1

  • 利⽤顺序表存储,表元素由数据和⽗结点构成

  • 特点分析:

    • 根结点没有双亲,所以位置域设置为-1

    • 知道一个结点,找他的⽗结点,非常容易,O(1)级

    • 找孩子节点,必须遍历整个表(需要寻找parent的值等于此数组下标的节点)

 

1.3.2 孩子表示法

孩子表示法存储普通树采⽤的是 "顺序表+链表" 的组合结构。

其存储过程是:

        从树的根节点开始,使⽤顺序表依次存储树中各个节点。

        需要注意,与双亲表示法不同的是,孩子表示法会给各个节点配备一个链表,⽤于存储各节点的孩子节点位于顺序表中的位置。

        如果节点没有孩子节点(叶子节点),则该节点的链表为空链表。

 

使⽤孩子表示法存储的树结构,正好和双亲表示法相反

查找孩子结点的效率很⾼,⽽不擅长做查找⽗结点的操作

优化:

我们还可以将双亲表示法和孩子表示法合二为一

  • 一个节点同时存储父节点下标和子节点链表

 

1.3.3 孩子兄弟表示法

 在树结构中,同一层的节点互为兄弟节点。

        例如普通树中,节点 A、B 和 C 互为兄弟节点,⽽节点 D、E 和 F 也互为兄弟节点。

所谓孩子兄弟表示法,指的是⽤将整棵树⽤二叉链表存储起来

        具体实现方案是:从树的根节点开始,依次存储各个结点的孩子结点和兄弟结点。 在二叉链表中,各个结点包含三部分内容:

 

示例:

 

 

在以孩子兄弟表示法构建的二叉链表中,如果要查找结点 x 的所有孩子

则只要根据该结点的 firstchild 指针找到它的第一个孩子

然后沿着孩子结点的 nextsibling 指针不断地找它的兄弟结点

就可以找到结点 x 的所有孩子。

typedef int DataType;
struct Node
{
  struct Node* _firstChild1;   // 第一个孩子结点
  struct Node* _pNextBrother;  // 指向其下一个兄弟结点
  DataType _data;        // 结点中的数据域
};

这是最常用的结构,后面我们将以此为基础使用代码实现二叉树的相关应用

1.4树在实际中的应用

后记:

此篇讲述了树的基本概念及相关的实现方式和实际生活中的应用等内容。

下篇将讲述二叉树概念·代码实现·堆排序等相关内容。

分享喜欢的一句话:

迷茫不是一件坏事。

在迷茫中能把事情完成就是好事。

很多人会细细考量任务的艰巨程度,把一切都看得很复杂,导致他们在半路上停下来。

 

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

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

相关文章

Lua 迭代器

Lua 迭代器 参考文章: 菜鸟教程。 https://cloud.tencent.com/developer/article/2203215 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 在 L…

23种设计模式之七种结构型模式

23种设计模式之七种结构型模式1. 设计模式概述1.1 什么是设计模式1.2 设计模式的好处2. 设计原则分类3. 详解3.1 单一职责原则3.2 开闭原则3.3 里氏代换原则3.4 依赖倒转原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特法则4. Awakening1. 设计模式概述 我们的软件开发技术也包…

[Python从零到壹] 番外篇之可视化利用D3库实现CSDN博客每日统计效果(类似github)

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望…

关于对公司做项目的一些想法

项目管理法则里面最重要的是如下的三角形:基于一定的范围、合理的时间和足够的成本下实现项目完成,并保证质量。项目中最重要的是质量,质量不行就意味着项目失败,请参考大跃进时期的大炼钢铁(多快好省大炼钢&#xff0…

是什么影响了 MySQL 索引 B + 树的高度?

提到 MySQL,想必大多后端同学都不会陌生,提到 B 树,想必还是有很大部分都知道 InnoDB 引擎的索引实现,利用了 B 树的数据结构。 那 InnoDB 的一棵 B 树可以存放多少行数据?它又有多高呢? 到底是哪些因…

WebRTC → 信令服务器

相关简介 信令:驱动系统运转。控制各个模块的前后调用关系;业务不同,逻辑不同,信令也会千差万别 要实现一对一通信,驱动系统的核心就是信令。信令控制着系统各个模块之间的前后调用关系,比如当收到用户成功加入房间后…

3D模型在线查看利器【多种格式】

BimAnt 3DViewer网站可以 打开多种 3D 文件格式并在你的浏览器中可视化展示3D模型,支持 obj、3ds、stl、ply、gltf、glb、off、 3dm、fbx 等等。 1、支持的3D模型格式 BimAnt 3DViewer网站支持多种文件格式的导入和导出。 如果文件格式有文本和二进制版本&#x…

Minecraft 1.19.2 Fabric模组开发 09.Mixin

我们今天用mixin在1.19.2 fabric中实现一个望远镜 1.由于fabric已经自动配置好了mixin,所以我们无需配置mixin,先在ItemInit中新建一个我们的望远镜物品: ItemInit.java public static final Item BIRDWATCHER registerItem("birdwat…

Smart-doc的脚本生成在线文档(精简官方文档描述)

Smart-doc优点: 无侵入的接口文档、在线文档生成器。三种生成文档方式。对于程序代码开发中只需要加注释(符合一定的语法,五分钟可掌握)就能生成在线文档。可以支持c、java、php、node等等常见的主流语言。 如何使用: …

47.Isaac教程--ORB

ORB ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录ORBGem 提供的类型关键点描述符如何使用 Gem(界面)构建包Isaac Codelets示例应用程序主机设备嵌入式 Jetson 设备这个 gem 提供了一个特征检测器和描述符提取器…

2011年专业408算法题

文章目录0 结果1 题目2 思路2.1 思路1(暴力解:排序)2.2 思路2(较优解:归并合并数组)2.3 思路3(较优解:数组指针后移)2.4 思路4(最优解:两个数组的…

webpack是如何进行依赖图谱收集的?

我自己学习webpack已有很长时间了,但是经常会遇到这样的问题: 可以熟练配置webpack的一些常用配置,但是对一些不常见的api或者概念总是云里雾里。因此,对着网上资料手写了一个简易版的webpack,现在对其中的依赖图谱收集部分进行梳…

Numpy(7)—字节交换、NumPy 副本和视图、深浅拷贝、矩阵库、NumPy 线性代数、NumPy IO(读写)、NumPy Matplotlib

1.字节交换 import numpy as npA np.array([1, 256, 8755], dtypenp.int16) print(A) print(list(map(hex, A))) print(A.byteswap(inplaceTrue)) print(list(map(hex, A)))2.NumPy 副本和视图 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不…

【MyBatis 持久层框架】Mapper代理开发详细解读

文章目录1. 前言2. Mapper 代理开发3. 过程剖析4. 总结1. 前言 前面在 MyBatis 快速入门篇中,我们使用了 MyBatis 原生的开发方式操作数据库,解决了 JDBC 操作数据库时的硬编码和操作繁琐的问题。实际上,在 Java 项目中,我们更常…

python3——函数

目录 一、函数定义 二、函数调用 1.打印Hello World 2.判断最大值 3.计算矩形面积 4.help说明文档 三、参数传递 (一)位置参数 (二)关键字参数 (三)默认参数(缺省参数) (四)可变参数(收集参数) 1.位置可变参数(接收所有的位置参数,返回一个元组) 2.关键…

高通开发系列 - MSM8909 lk aboot阶段点灯操作

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 第一种LK提供的接口实现第二种直接操作寄存器这篇文章之前请参考下:高通开发系列 - MSM8909指示灯操作 在LK中点灯有两种方式,一种…

JAVA-定位排查bug

在开发过程中难免会遇到bug,理解bug的含义,定位bug的位置,对于解决bug至关重要!掌握高效的排错技巧,对于程序员来说必不可少。 目录 一、错误异常的分类 二、常见报错信息及原因(持续更新中)…

域内权限维持:AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器,通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组,以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

Flex布局和主要属性用法详解

目录 前言 一个小例子 基本概念: 设置在主轴上的排列方式 设置在侧轴上的排列方式 更换主轴和侧轴方向 换行 align-content属性 元素(子容器)的相关属性 flex-basis flex-grow flex-shrink属性 flex属性 前言 flex布局是继标准…

JDBC-Statement

1.Statement执行静态sql语句(“字符串”) 返回结果 2.!实际工作一般用PreparedStatement来进行sql语句的执行,因为sql注入的风险 3and4.SQl注入就是Statement没有检查我们输入sql语句,一些别有用心的可能写一些危害数据…