顺序存储结构
顺序存储结构对完全二叉树而言,既简单又节省存储空间。但是,对于一般二叉树的数序存储,为了能用结点在一维数组中的相对位置来表示结点之间的逻辑关系,也必须按照完全二叉树的形式来存储树中的节点,造成存储空间浪费。二叉树可以用数组或线性表来存储,而且如果这是完全二叉树,这种方法不会浪费空间。用这种紧凑排列,如果一个结点的索引为i,它的子结点能在索引2i+1和2i+2找到,并且它的父节点(如果有)能在索引floor((i-1)/2)找到(假设根节点的索引为0)。这种方法更有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。然而,它需要连续的存储空间,这样在存储高度为h的n个结点组成的一般普通树时将会浪费很多空间。一种最极坏的情况下如果深度为h的二叉树每个节点只有右孩子需要占用2的h次幂减1,而实际却只有h个结点,空间的浪费太大,这是顺序存储结构的一大缺点。
二叉链表
二叉树一般采用二叉链表作为链式存储结构。
在这种存储方式下,二叉树的每个结点包括三个成员。
lchild (指向该结点左孩子的指针) | data 结点本身的值 | rchild (指向该结点右孩子的指针) |
三叉链表
改进于二叉链表,增加父节点的指引,能更好地实现节点间的访问,不过算法相对复杂。这里不再介绍。
用二叉链表表示二叉树
#include<malloc.h>
#include<stdio.h>
typedef struct btnode{
int data;
struct btnode *lchild;
struct btnode *rchild;
}BTNODE,*BINTREE;
void createbintree(BINTREE *t){/*输入二叉树的先嘘遍历序列,创建二叉链表*/
int a;
scanf("%d",&a);
if(a==0)
*t=NULL;
else{
*t = (BTNODE *)malloc(sizeof(BTNODE));/*申请结点*t的结点空间*/
(*t)->data = a;/*将结点数据a放入根结点的数据域*/
createbintree(&(*t)->lchild);/*建立左子树*/
createbintree(&(*t)->rchild);/*建立左子树*/
}
}
main(){
BINTREE t= NULL;
createbintree(&t);
}