树的存储方式--vector容器和链式前向星

文章部分截图来自于比特算法竞赛课程,仅供学习交流,侵权联系删除;

1.树的存储

学会使用孩子表示法,对于我们的树进行表示和遍历的过程,孩子表示法,就是只关心这个孩子的信息;

清楚这个父子关系的情况里面,我们存储的就是孩子,但是在不清楚这个父子关系的树里面,我们把这个相连接的所有的节点全部记录下来即可;

2.使用vector对于树的节点存储的代码实现

下面的这个就是我们的代码:实际上就是把和这个节点相连接的所有的节点全部使用vector插入数据的形式放到我们的这个容器里面去;

edge对应的节点就是我们的这个主干上面的节点,具体可以去参照上面的图里面的蓝色的集合,也就是这个里面的每一个数据背后都是一个容器,一个vector容器;

因为我们的这个假设的情况是无根数,因此这个里面比如说1和2相连接,这个时候我们的1容器里面需要插入我们的数据2,我们的这个2对应的容器里面需要插入这个数据1,因此对于同样的这个链接而言,我们是需要进行两次这个插入的操作的;

3.链式前向星--链表法

这个方法的名字起的非常的奇怪,我也觉得非常的奇怪,但是这个原理简单,但是操作起来并不是很容易,起码我自己还是觉得有些难度的,但是这个代码写起来真的非常的简单,仅仅从这个代码的行数来看,这个题目似乎不是很难,但是从这个理解上面来看,我觉得需要好好看一下;

这个要求大家对于之前学习的这个链表理解的非常的深刻,像我自己,之前第一次学习这个链表的时候理解就不是非常的到位,因此这个里面还是遇到了一点问题的;

其次就是我觉得需要理解这个里面涉及到的对应的数组的含义,存放的是什么东西,以及这个指针的指向的具体的内容,这些关系大家一定需要缕清,我觉得这个事非常的重要的;

下面的这个是上课的时候老师的课件展示,我直接按照这个操作的流程基图展示给大家把,并且进行这个相关的说明,希望可以对于大家有所帮助;

下面的这个是最开始的一张图:此时我们的3指向1,下面的这个图片里面的橙色的部分哈,因此这个时候的第一个操作就是把这个1存放到我们的3对应的链表里面去;

也就是说,把这个孩子存放到这个父亲对应的这个链表里面去,这个31之间的关系当中,这个3就是父亲,1就是孩子,因此这个是把1存放到这个3的链表里面去;

存放的过程分为下面的这个步骤,一共是两个步骤,上面的这个仅仅展示的是第一个步骤:

1)在我们的这个e数组里面存放下来我们的数据区域的内容,也就是这个孩子的内容,因为这个孩子是需要进行插入的,因此上面的这个里面e数组,ne数组原本都是0,但是这个时候我们的1就变成了黄色的,意味着我们的这个1已经放到我们的数据数组里面去了;

2)第二个就是回想我们的头插时候进行的操作,也就是我们的插入的节点指向我们的头结点的下一个元素,头结点指向我们的插入元素,这个具体案例里面,这个h数组存放的就是我们的头结点;

这个具体的变化就是我们的ne数组里面的内容发生了变化:下面的这个数组里面的ne数组存放的类似于我们的链表节点里面的这个next指针,这个时候需要指向我们的这个头结点的下一个位置,因此这个h数组里面的3对应的0就是头结点的下一个位置,这个时候需要传递给我们的这个ne数组里面的下标为1的位置;

其次就是这个h数组表示头节点,需要指向我们的这个插入节点,因此这个插入节点的下标1需要放到我们的H数组里面去(下面的这个还没有体现出来哈)

下面的这个体现的就是对于我们的头结点的信息进行更新的过程:上面其实已经提到了,就是把我们的这个插入节点的下标,放到我们的h数组里面去,因此这个h数组里面的3下标的位置出现了这个黄色的1,表示的就是我们的插入的节点的下标

上面的这个事一个非常标准化的过程,接下来的操作都是类似的,我不再进行详细的赘述了;

下面的这个是我们的链式前向星的代码:

需要注意的就是我们的这个数组空间开辟的大小的问题,h数组里面的就是我们的虚拟头结点,但是对于这个e数组和ne数组而言,针对于解决这个样子的无根数,这个时候我们的1和3之间有链接,3和1之间有链接,这个一组链接实际上我们需要进行二次存储,因此这个我们的这个e数组和ne数组需要进行二倍的空间使用;

add函数的内容就是模拟的我们的链表节点的头部插入的内容

相关推荐
啊我不会诶14 小时前
24ICPC成都站补题
数据结构·算法
2401_8414956416 小时前
【计算机视觉】基于数学形态学的保留边缘图像去噪
人工智能·python·算法·计算机视觉·图像去噪·数学形态学·边缘保留
十八岁讨厌编程17 小时前
【算法训练营Day30】动态规划part6
算法·动态规划
CoderYanger17 小时前
优选算法-双指针:2.复写零
java·后端·算法·leetcode·职场和发展
charlie11451419117 小时前
理解C++20的革命特性——协程支持2:编写简单的协程调度器
c++·学习·算法·设计模式·c++20·协程·调度器
hadage23317 小时前
--- 常见排序算法汇总 ---
算法·排序算法
Mrs.Gril18 小时前
目标检测:yolov7算法在RK3588上部署
算法·yolo·目标检测
WWZZ202519 小时前
ORB_SLAM2原理及代码解析:单应矩阵H、基础矩阵F求解
线性代数·算法·计算机视觉·机器人·slam·基础矩阵·单应矩阵
2401_8414956420 小时前
【计算机视觉】分水岭实现医学诊断
图像处理·人工智能·python·算法·计算机视觉·分水岭算法·医学ct图像分割
liulilittle20 小时前
网络编程基础算法剖析:从字节序转换到CIDR掩码计算
开发语言·网络·c++·算法·通信