6.3.1 顺序存储结构

  用一组地址连续的存储单元存储二叉树中的数据元素。

 二叉树的顺序存储结构的定义如下:
  const MAXSIZE = 100;  // 暂定二叉树中结点数的最大值为100
  typedef struct {
   ElemType *data;    // 存储空间基址(初始化时分配空间)
   int nodeNum;     // 二叉树中结点数
  } SqBiTree;       // 二叉树的顺序存储结构

  为了能在存储结构中反映出结点之间的逻辑关系,必须将二叉树中结点依照一定规律安排在这组存储单元中。

  对于完全二叉树,只要从根起按层序存储即可。根据上一节所述完全二叉树的特性,将完全二叉树上编号为 i 的结点元素存储在一维数组中下标为 i-1 的分量中,如上两页图所示含10个结点的完全二叉树的顺序存储结构如下所示。

0
1
2
3
4
5
6
7
8
9
 
 
a
b
c
d
e
f
g
h
i
j

  对于一般的二叉树,可对照完全二叉树的编号进行相应的存储,但在没有结点的分量中需填充空白字符。显然,这种存储表示方法只适合于完全二叉树,对于一般的二叉树将造成存储空间的很大浪费。因此二叉树的常用存储结构是链表。

 

  按照数据结构的"顺序存储映象"的定义,在顺序存储结构中没有附加信息,因此对二叉树的顺序存储结构,也只是以一组地址连续的存储空间存放二叉树中的数据元素。只是不能以"存储位置相邻"来表示 "后继"关系。

  根据上节所述二叉树的特性五,可推出顺序存储结构中"双亲"和"孩子"的关系:
  假设 bt.data[i] 是完全二叉树上的一个结点,若 2i+1<bt.nodeNum,则 bt.data[2i+1] 是它的左孩子,否则它的左子树为空树;若 2i+2<bt.nodeNum,则 bt.data[2i+2]是它的右孩子,否则它的右子树为空树。

  思考题 一个深度为 k 且只有 k 个结点的右单支树需要的数组存储空间为多少?