二叉树的存储结构1-----顺序存储结构
前面我们已经谈到了树的存储结构,知道用顺序存储对树这种一对多的关系结构实现起来比较困难,但是二叉树是一种特殊的树,因此由于这种特殊性,使得用顺序存储结构也可以实现。
二叉树的顺序存储结构,就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标,要能够体现结点之间的逻辑关系,比如,双亲与孩子的关系,左右兄弟的关系,等。
完全二叉树的顺序存储
将这棵二叉树存入到数组中,相应的下标对应其同样的位置:
一般二叉树的顺序存储
对于像下面这样一般的二叉树:
我们把它补充成一棵完全二叉树的样子,然后按完全二叉树编号,只不过,把不存在的结点位置设置为“^”,表示不存在,
问题
考虑一种极端的情况,一棵深度为K的右斜树,它只有K个结点,却需要分配
2
k
−
1
2^k-1
2k−1个存储单元空间,这显然是对存储空间的浪费,所以,顺序存储结构一般只用于完全二叉树。
二叉树的存储结构2-----二叉链表
既然顺序存储适用性不强,我们就要考虑链式存储结构。
二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。
二叉链表的结点结构:
data:数据域;
lchild和rchild:指针域,分别存放指向左孩子和右孩子的指针。
可以改进
就如同树的存储结构中讨论的一样,如果有需要,还可以再增加一个指向其双亲的指针域,那样就称之为三叉链表。