前言
在我第一篇的文章中,我大体概述了图的存储的知识点,那么这篇文章,我们就来介绍一下图的存储中特殊的一环:树的存储与遍历
树的存储
对于我们存储一棵树,我们大体上有三种方法:数组,结构体,邻接表。同时这几种方法,各有各的利弊
但是一定要注意的是,数组存树只能存二叉树
数组
数组存树就比较好理解了,就是通过对满二叉树通过对每一个节点从一开始逐层标号存储图,对于每一个根节点来说,他的左子树序列号为
2
∗
n
2*n
2∗n,而他的右子树序列号为
2
∗
n
+
1
2*n+1
2∗n+1,这样,通过根节点的位置,就能很快找出整个二叉树来
但是对于非满二叉树来说,每个节点的序号对于这个树的满二叉树的编号是一样的,也就是说对于只有右子树且只需要存4个点的二叉树我们需要开大小为15的数组,造成了极大的空间浪费,所以数组存树通常用于满二叉树或近满二叉树的情况下才会使用。
结构体
结构体存树一共有两种方法:通过存每个点根节点或存每个点子节点。
存根节点
存根节点可以很快的从任意一个子节点向上查询完整个二叉树,但是从根节点向下遍历确十分的难。
存子节点
存子节点与存根节点相反,可以很快的从任意一个根节点向下遍历完整个二叉树,但是对于从子节点查询根节点很麻烦。
但值得注意的是,存根节点和存子节点的方法可以共存,理论上可以起到相辅相成的作用,但是会增加代码量和不确定因素;
邻接表
邻接表可以说是很常用的存储方式,无论是存图还是存树都是很管用的。对于邻接表存树,就需要用到链式前向星来存,具体存储方式可以查看我第一篇文章,再此就不多叙述了
树的遍历
对于遍历一棵树,和遍历图一样,最常用的就是深度优先搜索和广度优先搜索,常见题型的思路大概为用链式前向星存下树,之后根据题目用广搜或深搜遍历树,并找出题目所要求的值,也有些极端点的题,存储方法或许会要求使用其他方法。
总结
以上即为树的存储目前所想到的知识点,树本质上也是种图,所以一些在《图的存储》文章中提到的就没有重复说明,日后将会继续完善,如果有错误的地方请指出来,会及时改正