二叉树的顺序存储结构------(C语言实现)
上图所示的二叉树用顺序存储方式存为
以A结点为例:相当于一个一维数组啦
设A结点下标为i时
A的左子树下标为2*i +1,B就是 2*0+1 = 1
A的右子树下标为2*(i +1),C就是 2*(0+1) = 2
想必大家也发现了,这很容易造成内存的浪费
如上图只有A,B,D结点的话
下面是代码实现:
//定义二叉树的最大结点数 #define MAX_SIZE 255 //下标为0的位置存储根结点 typedef Element SqBinTree[MAX_SIZE]; SqBinTree tree;
#include <stdio.h> #include <stdlib.h> //定义二叉树的最大结点数 #define MAX_SIZE 255 //下标为0的位置存储根结点 typedef char SeqBinTree[MAX_SIZE];//可以参考我写的文章 (c语言中的typedef) //初始化 void InitTree(SeqBinTree tree); //创建二叉树 void CreatSeqtree(SeqBinTree tree,int index); //打印二叉树 void PrintSeqtree(SeqBinTree tree); int main(void) { SeqBinTree tree; InitTree(tree); CreatSeqtree(tree,0); PrintSeqtree(tree); return 0; } void InitTree(SeqBinTree tree) { //将字符数组中的每个元素的设置为空 int i; for(i=0;i<MAX_SIZE;i++) { tree[i] = ; } } //创建二叉树 void CreatSeqtree(SeqBinTree tree,int index) { char ch; printf("请输入根结点: "); ch = getchar(); fflush(stdin);//清空缓冲区 if(ch == ^) { tree[index]= ; return; } tree[index] = ch; //某个结点输入完毕后,还需要让用户输入左孩子和右孩子 printf("输入左孩子结点: "); CreatSeqtree(tree,2*index+1); printf("输入右孩子结点: "); CreatSeqtree(tree,2*(index+1)); } //打印二叉树 void PrintSeqtree(SeqBinTree tree) { int i; for(i=0;i<15;i++)//随便打印十五个看看 { printf("%c ",tree[i]); } }