几种树的储存结构

本文详细介绍了树的几种储存结构,包括二叉树的顺序储存和链式储存,普通树的Parents表示法、孩子表示法、Parents-Children表示法及孩子兄弟法。此外,还专门讨论了Huffman树的特定储存需求,提出了适用于Huffman树的复合数组结构。

一、二叉树

1、顺序储存结构

利用一段连续的储存空间,即数组的形式,按照满二叉树的结构,从上到下,从左到右,按顺序将元素存入数组中,空缺的元素用零补齐。对于满二叉树和完全二叉树,数组中没有零元素,空间利用率达到100%。但其余情况下空间利用率低,所以顺序储存结构最适用于完全二叉树(满二叉树可以视为完全二叉树);

2、链式储存结构

使用链表储存,链表的每个结点的储存结构为:数据域 + 左孩子指针 + 右孩子指针

这样的储存结构优势在于不论何种形式的二叉树都可以较好的利用空间,但是由于叶子结点的左右指针域都为空,没有很好的利用上。

二、树

1、Parents表示法(即书中所谓双亲表示法,这种翻译怎么看怎么奇怪)

使用一组连续的空间储存(即数组),数组中每个元素的储存结构为:数据域 + Parents地址域

将树中的所有元素按照从上到下,从左到右的顺序依次记录到数组中对应的各数据域,再将其Parents的地址(在数组中就是Parents的序号)分别存入对应的指针域。树的根没有Parents(孤儿),所以指针域置为-1或其他约定好的数字。

Parents表示法的优势在于方便找到各元素的Parents结点,但要找到某个元素的子节点就必须要遍历整个数组,时间复杂度较高。

2、孩子表示法

有两种方法可以实现:

  • 使用链表加数组的形式储存,结点的结构为:数据域 + 孩子指针。

    将树中的所有元素(例如n个)的孩子元素按照顺序形成一个单链表,这样就获得了n个单链表(叶子元素只有它自身),同时为了方便查找,将所有的单链表的首元结点(也就是该链表中所有孩子的Parents元素),实际上就是树中的全部元素按照顺序储存到一个连续的空间(即一个数组之中)。储存在数组中的目的是便于查找。

  • 使用多重链表的形式储存

    使用多重链表,即一个结点中有多个指针域,可以指向其所有的孩子结点。多重链表的每个结点可以是同构的,即所有的结点大小都为树的度(degree);也可以是异构的,这时就需要在结点中添加一个“度域”,用于表示当前结点下对应的孩子个数。

孩子表示法总体来说就是通过链表的形式,表示出树中每个元素的孩子元素。孩子表示法可以很方便找到元素的孩子,但是不容易找到它的Parents。

3、Parents-Children表示法

通过吸收孩子表示法和Parents表示法各自的优势,在孩子表示法的第一种实现的基础上,在储存所有元素的数组中,给每个元素都添加一项其Parents的地址(这里当然是数组中的序号)

其实数组和链表从储存形式上来说并没有不可逾越的鸿沟,它们都可以相互改造生成的,数组和链表表现有差异的地方在于进行基本的线性表处理时(比如增删改查)的方便程度

4、孩子兄弟法

这是应用最为普遍的储存结构。使用链表的形式进行储存,链表中每个结点的结构为:首孩子地址域 + 数据域 + 兄弟地址域。

这样的储存方式可以很好的找到所有的孩子结点,同时这样的结构和二叉树的二叉链表的形式完全相同,便于将一般的树转变为二叉树处理。

三、Huffman树

Huffman树严格来说是一棵二叉树,但是由于其:
1、需要通过向上回溯直至根结点以此来得到某个叶子结点的Huffman编码,所以每个元素都必须有其Parents的地址;
2、需要知道元素是其Parents的左孩子还是右孩子(决定了编码为0还是1);
3、Huffman树构造的过程中依赖各结点的权重,所以需要开辟权重域。
综上所述,需要建立一个专门为Huffman树服务的数据结构。

Huffman树查找频繁,所以肯定优先考虑数组结构;结合以上的需求分析,Huffman树的每个结点都要知道其左右孩子和Parents的地址(即数组中元素的序号),且不需要设置数据域。所以使用复合数组,数组中每个元素分别包含:Parents地址 + 左孩子地址 + 右孩子地址 + 权重域。这样的结构既方便回溯,同时也方便建立Huffman结构(提供权重域,便于在建立过程中储存子树根结点的权重值)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值