C#与数据结构--二叉树的遍历 6
2 二叉树的存储结构 二叉树的存储可分为两种:顺序存储结构和链式存储结构
顺序存储结构 把一个满二叉树自上而下、从左到右顺序编号,依次存放在数组内,可得到图6
8(a)所示的结果
设满二叉树结点在数组中的索引号为i,那么有如下性质
(1) 如果i = 0,此结点为根结点,无双亲
(2) 如果i > 0,则其双亲结点为(i -1) / 2
(注意,这里的除法是整除,结果中的小数部分会被舍弃
) (3) 结点i的左孩子为2i + 1,右孩子为2i + 2
(4) 如果i > 0,当i为奇数时,它是双亲结点的左孩子,它的兄弟为i + 1;当i为偶数时,它是双新结点的右孩子,它的兄弟结点为i – 1
(5) 深度为k的满二叉树需要长度为2 k-1的数组进行存储
通过以上性质可知,使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法
为了用结点在数组中的位置反映出结点之间的逻辑关系,存储一般二叉树时,只需要将数组中空结点所对应的位置设为空即可,其效果如图6
8(b)所示
这会造成一定的空间浪费,但如果空结点的数量不是很多,这些浪费可以忽略
一个深度为k的二叉树需要 2 k-1个存储空间,当k值很大并且二叉树的空结点很多时,最坏的情况是每层只有一个结点,再使用顺序存储结构来存储显然会造成极大地浪费,这时就应该使用链式存储结构来存储二叉树中的数据
链式存储结构 二叉树的链式存储结构可分为二叉链表和三叉链表
二叉链表中,每个结点除了存储本身的数据外,还应该设置两个指针域 left和right,它们分别指向左孩子和右孩子(如图 6
9(a)所示)
当需要在二叉树中经常寻找某结点的