顺序二叉树的数据结构为:
#define MAX_TREE_SIZE 100;
typedef TElemType Btree[MAX_TREE_SIZE ];
Btree bt;
顺序二叉树是用一组地址连续的存储单元依次自上而下自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为i的结点元素存储在如上定义的一维数组中下标为i-1的分量中。顺序二叉树仅适用于完全二叉树,因为在最坏的情况下,一个深度为k且只有k个结点的单枝树(不存在度为2的结点)却需要长度为2^k-1的一维数组。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAXLENGTH 100
#define ClearBiTree InitTree
typedef char TElemType;//二叉树存储类型
typedef int QElemType;//队列存储类型
typedef TElemType Btree[MAXLENGTH];//二叉树顺序存储结构,下表0为根节点
typedef struct
{
QElemType *base;
int front;
int rear;
}Queue;//队列存储结构
typedef struct
{
int level;//节点的层
int order;//本层序号(按满二叉树算)
}position;//记录节点的位置
TElemType NIL = ' ';
int(*VisitFunc)(TElemType); // 函数变量
//初始化二叉树,构造空二叉树
void InitTree(Btree t)
{
int i;
for(i=0;i<MAXLENGTH;i++)
{
t[i] = NIL;
}
}
//销毁二叉树
void DestroyTree()
{
//因为Btree为丁长类型,无法销毁
}
void CreateBtree(Btree t)
{
int i;
int len;
char s[MAXLENGTH];
printf("请按层输入结点值,空格表示空节点,结点数<%d\n",MAXLENGTH);
gets(s);//将输入赋给s
len = strlen(s); //输入字符串的长度
//将s的值赋给二叉树
for(i=0;i<len;i++)
{
t[i] = s[i];
//当结点不是根节点及结点的双亲结点为NIL及当前结点不为NIL,则无双亲
if(i !=0 && t[(i+1)/2-1] == NIL && t[i] != NIL)
{
printf("出现无双亲的非根结点");
exit(0);
}
}
for(i = len;i<MAXLENGTH;i++)
{
t[i] = NIL;
}
}
//判断二叉树是否为空,1为空,0不空
int IsTreeEmpty(Btree t)
{
if(t[0] == NIL)
return 1;
return 0;
}
//得到树的深度
int getTreeDepth(Btree t)
{
int i=0;
int j =-1;
//找到最后一个结点,并记录结点的数据
for(i = MAXLENGTH-1;i>=0;i--)
{
if(t[i] != NIL)
break;
}
i++;
do
{
j