上图所示的二叉树用顺序存储方式存为
结点 | A | B | C | D | E | 0 | F |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
以A结点为例:相当于一个一维数组啦
设A结点下标为i时
A的左子树下标为2*i +1,B就是 2*0+1 = 1
A的右子树下标为2*(i +1),C就是 2*(0+1) = 2
想必大家也发现了,这很容易造成内存的浪费
如上图只有A,B,D结点的话
A | B | 0 | D | 0 | 0 | 0 | 0 |
下面是代码实现:
//定义二叉树的最大结点数
#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] = '\0';
}
}
//创建二叉树
void CreatSeqtree(SeqBinTree tree,int index)
{
char ch;
printf("请输入根结点:\n");
ch = getchar();
fflush(stdin);//清空缓冲区
if(ch == '^')
{
tree[index]='\0';
return;
}
tree[index] = ch;
//某个结点输入完毕后,还需要让用户输入左孩子和右孩子
printf("输入左孩子结点:\n");
CreatSeqtree(tree,2*index+1);
printf("输入右孩子结点:\n");
CreatSeqtree(tree,2*(index+1));
}
//打印二叉树
void PrintSeqtree(SeqBinTree tree)
{
int i;
for(i=0;i<15;i++)//随便打印十五个看看
{
printf("%c ",tree[i]);
}
}