存储数据包括两部分:数据+数据间的逻辑关系(结构)
类似线性表,二叉树的存储结构也包括顺序存储,链式存储
1.顺序存储
使用一组地址连续的存储单元来存储数据元素,为了能够在存储结构中反映出结点之间的逻辑关系,必须将二叉树中的结点按照一定规律安排在这组单元.
本质:因为要体现数据之间的逻辑关系,所以要有规律.满二叉树是最理想的二叉树,从根节点开始给结点编号,按照自上而下,从左到右编号.那么可以用一个一维数组来存储,若根结点编号为1,则对应数组下标为0的分量,以此类推.对于一般二叉树也用这种方法,即使一般二叉树中不存在的结点也要在数组中保留存储位置.
从中可以看出这种方法适用于满二叉树和完全二叉树,否则会造成空间浪费,因为数组的长度是由二叉树最后一个结点对应满二叉树中的结点的编号决定的而不是二叉树的结点总数决定的.
最坏情况:深度为k且只有k个结点的二叉树需要2^k-1长度的一维数组。
2.链式存储
存储单元不必连续.
关键在于结点的组成部分,用链表存储二叉树至少需要3个域:数据域,左指针域,有指针域.
二叉链表(含有两个指针域,孩子表示法):|lchild|data|rchild|
三叉链表(含有三个指针域,其中一个为双亲指针域,孩子双亲表示法):|lchild|data|parent|rchild|
关于二叉链表一个重要性质:在含有n个结点的二叉链表中一定有n+1个空链域.
证明:n个结点必定有2n个链域(链域的存在就是为存储其左右孩子的,即使没有),除了根节点外,剩余结点占有一个链域,即n-1个链域,所以空链域=2n-(n-1)=n+1.
二叉树的存储是将二叉树的数据+结构存储下来