一、顺序存储结构
二叉树的顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在某个数组下标为i-1的分量中,然后通过一些方法确定结点在逻辑上的父子和兄弟关系。
完全二叉树和满二叉树采用顺序存储比较合适,节省空间且数组元素下标值能确定结点在二叉树中的位置和结点之间的关系。但对于一般二叉树,则需要添加一些并不存在的空结点,所以效率并不高。
顺序存储示意图如下:
注意:
这种存储结构显然要从数组下标1开始存储树中的结点。同时也要注意区别树的顺序存储结构与二叉树的顺序存储结构。在树的顺序存储结构中,数组下标代表结点的编号,下标上所存的内容指示了结点之间的关系。而在二叉树的顺序存储结构中,数组下标既代表了结点的编号,又指示了树中各结点之间的关系。
二叉树属于树,因此二叉树都可以用树的存储结构来存储,但树却不能都用二叉树的存储结构来存储。
二、链式存储结构
链式结构是指用一个链表来存储一棵二叉树,二叉树中的每个结点用链表的一个链结点来存储。
在二叉树中,结点结构通常包括若干数据域和若干指针域。二叉链表至少包含3个域:数据域data、左指针域lchild和右指针域rchild,若下图所示:
常用的二叉链表存储结构如下图所示:
二叉树的链式存储结构描述如下:
typedef struct BiTNode{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;
注意:
在含有n个结点的二叉链表中,含有n+1个空链域。
使用不同的存储结构时,实现二叉树操作的算法也会不同,因此要根据实际应用场合选择合适的存储结构。