1. 二叉树的顺序存储:
用一组连续的存储单元依次自上而下、自左而右存储完全二叉树的结点元素。
完全二叉树的逻辑关系的表示:利用了完全二叉树的双亲结点和孩结点的编号规则。即双亲结点编号为i,其左孩子结点为(2i),右孩子结点为(2i+1),反之亦可。因此为了保证完全二叉树的结点编号与内存数组中的结点编号一致的话,此时应该使数组内存前空一格。而这空的一格通常可以存储二叉树的结点个数。
如下:
对于非完全二叉树,是不可以采用之前方法对逻辑关系进行表示。其逻辑关系表示为:
添加一下不存在的空结点,在数组中用0表示。
顺序存储在最坏情况下会非常浪费存储空间,比较适合完全二叉树。如下:
2. 二叉树的链式存储:
用链表来存放一棵二叉树,二叉树中每个结点用链表的一个链结点来存储。其内存中物理结构表示如下:
因为二叉树最多两个孩子结点,因此在每个链结点处需要有三个元素,两个指针指向下两个孩结点。
二叉树的链式存储定义:
typedef struct BiTNode
{
int data;
BiTNode *lchild,*rchild;
}*BiTree;
其图像表示如图:
从上图可以知道:含有n个结点的二叉链表中,有n+1个空链域。过程如下:n个结点有2n个链域,其中总共有n-1条链(由结点数目比度的数目多1得到),因此可以得到有(2n-(n-1))