这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战
二叉树的顺序存储结构
根据顺序存储结构的定义,用一组地址连续的存储单元依次存放二叉树的数据元素。又根据二叉树的性质六,完全二叉树中结点编号之间的关系可以正确反映出结点之间的逻辑关系。将一颗具有n个结点的完全二叉树上所有结点的数据信息,按照该编号顺序的存放在一个一维数组BT中,则数组中每个元素的下标与该元素在完全二叉树中相应结点的编号相对应,这样,数组元素下标之间的关系同样可以反映出二叉树中结点之间的逻辑关系,并称数组BT为该完全二叉树的顺序存储结构。
这样既不浪费存储空间,又可以方便地利用地址计算公司确定结点的位置。对于完全二叉树(尤其是满二叉树)采用顺序存储结构比较核酸,它能够充分利用存储空间;而对于一般二叉树,如果需要虚设很多“虚结点”才能使它成为一棵形式上的完全二叉树,则采用顺序存储结构就会使得许多存储空间存放的是空值。
由于顺序存储结构固有的一些缺陷,会使得二叉树的插入、删除等操作不方便,且效率也比较低。因此,对于二叉树来说,当树的形态与大小经常发生动态变化时更合适的方法是采用链式存储结构。
二叉树的链式存储结构
所谓二叉树的链式存储结构是指采用链表形式来存储一棵二叉树,二叉树中的每一个结点用链表中的一个链结点来存储。
- 二叉链表结构 二叉树的每个结点由一个数据元素和分别指向其左、右子树的两个分支构成,因此,链表中每一个链结点由3个域组成,除数据域外,设置两个指针域,分别用来给出该结点的左孩子与右孩子所在链结点的存储地址。
- data域存放结点的数据信息
- lchild存放左孩子的指针
- rchild存放右孩子的指针
- 当左孩子或者右孩子不存在时,相应指针域值为空(用符号^或者NULL表示)
- 三叉链表结构 有的时候,为了便于找到结点的双表结点,还可以在链结点中增加一个指针域,三叉链表就是在二叉链表的基础上增加了一个指向双亲结点的指针域。
每一个链表结构中,每一个链结点由4个域组成
- parent域为指向该结点双亲结点的指针
- 其他同二叉树
这种存储结构既便于查找孩子结点,也便于查找双亲结点;但是,相对二叉链表存储结构而言,它增加了空间开销,但在某些应用中,采用三叉链表要比二叉链表方便一些。
二叉链表结构中链结点的类型
typedef struct node {
datatype data; // 数据域
struct node *lchild, *rchild; // 指向左、右孩子树的指针域
} BTNode, *BTREE;