二叉树的存储结构该如何选择呢

来源:互联网 发布:初中英语网络课程 编辑:程序博客网 时间:2024/05/01 18:55

不多先上个二叉树的图:

这里写图片描述

我们先是从ABCDEFG这个顺序依次编号为1-7.
下面是描述了一个数组顺序存储结构。我们依次把A-G存入数组的索引为1到7当中。
有没有发现一个规律。假如我们的数组索引和二叉树中的编号是不是一一对应,刚好我们通过索引的计算就可以从数组当中得到当前数据的左右孩子和双亲节点。假如i代表当前的节点。公式还是i = 2i得到左孩子节点,i = 2i + 1右孩子节点。
从这里我们也发现了满二叉树或者叫完全二叉树的优势,但是事事不是会那么如意,假如我把D节点删掉,如果我们要保存这个通过下标索引得到节点的孩子,删除的节点必须占一个内存,我们设为null就可以。浪费一个内存,假如我们删除很多节点呢,比如极端的情况

这里写图片描述

通过观察上图我们只有3个数据节点,但是我们为了维护这3个节点的双亲孩子关系正确,我们还是必须开7个数据内存空间进行存储。发现有4个内存空间都是浪费的,利用率低于50%。
因此我们需要考虑其他的办法来解决空间浪费问题,我们只能把双亲孩子的关系直接通过指针存入当期节点里面的数据当中。
因为下面引入非常牛逼的链式存储结构,我想你们对链式存储结构的高效是非常了解的吧,等于是用极少的内存也就是保存孩子节点的地址即可。大家都知道地址占用的内存是很少的,假如是4G内存,那么地址空就是4G/8位 得到的子节数,然后我们从0开始编号。我记得不错话这些编号4个字节内存就可以完全存储。因此我们用4个字节数存储孩子的节点地址。

上图:
这里写图片描述

大家观察每个节点两侧的格子然后+ 箭头。我们看的出是告诉我们他关联的节点是什么。用编程语言来描述的话就是2个数据类型保存了孩子节点的地址。

下面给节点数据类型上代码
typedef char EleType
typedef struct BiTNode
{
EleType data; //保存了图中的字母
struct BiTNode *lchild, rchild; //分别保存左右孩子节点的地址
}BiTNode, *BiTree

原创粉丝点击