数据结构c语言版二叉树的顺序存储表示,数据结构C语言 二叉树的顺序存储表示和实现.doc...

数据结构C语言 二叉树的顺序存储表示和实现

/*

数据结构C语言版 二叉树的顺序存储表示和实现

P126

编译环境:Dev-C++ 4.9.9.2

日期:2011年2月13日

*/

#include

typedef char TElemType;

// 二叉树的顺序存储表示

#define MAX_TREE_SIZE 100 // 二叉树的最大结点数

typedef TElemType SqBiTree[MAX_TREE_SIZE]; // 0号单元存储根结点

typedef struct

{

int level,//结点的层

order;//本层序号(按满二叉树计算)

}position;

typedef int QElemType;

// 队列的顺序存储结构(可用于循环队列和非循环队列)

#define MAXQSIZE 5 // 最大队列长度(对于循环队列,最大队列长度要减1)

typedef struct

{

QElemType *base; // 初始化的动态分配存储空间 相当于一个数组

int front; // 头指针,若队列不空,指向队列头元素,相当于一个数组下标

int rear; // 尾指针,若队列不空,指向队列尾元素的下一个位置

// 相当于一个数组下标

}SqQueue;

#define ClearBiTree InitBiTree // 在顺序存储结构中,两函数完全一样

TElemType Nil = ' '; // 设空为字符型的空格符

// 构造空二叉树T。因为T是固定数组,不会改变,故不需要&

int InitBiTree(SqBiTree T)

{

int i;

for(i=0;i

T[i]=Nil; // 初值为空

return 1;

}

void DestroyBiTree()

{

// 由于SqBiTree是定长类型,无法销毁

}

// 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T

int CreateBiTree(SqBiTree T)

{

int i = 0, l;

char s[MAX_TREE_SIZE];

printf("请按层序输入结点的值(字符),空格表示空结点,结点数≤%d:\n",

MAX_TREE_SIZE);

printf("例如:abcefgh\n");

gets(s);// 输入字符串

l = strlen(s);// 求字符串的长度

for(;i

{

T[i]=s[i];

// 此结点(不空)无双亲且不是根,T[(i+1)/2-1] == Nil表示T[i]无双亲

if(i!=0 && T[(i+1)/2-1] == Nil && T[i] != Nil)

{

printf("出现无双亲的非根结点%c\n",T[i]);

exit(0);

}

}

for(i=l;i

T[i]=Nil;

return 1;

}

// 若T为空二叉树,则返回1,否则0

int BiTreeEmpty(SqBiTree T)

{

if(T[0]==Nil) // 根结点为空,则树空

return 1;

else

return 0;

}

// 返回T的深度

int BiTreeDepth(SqBiTree T)

{

int i,j=-1;

for(i=MAX_TREE_SIZE-1;i>=0;i--) // 找到最后一个结点

if(T[i] != Nil)

break;

i++; // 为了便于计算

do

j++;

while(i>=pow(2,j));//i > pow(2, depth-1) && i <= pow(2, depth)

return j;//j = depth;

}

// 当T不空,用e返回T的根,返回1;否则返回0,e无定义

int Root(SqBiTree T,TElemType *e)

{

if(BiTreeEmpty(T)) // T空

return 0;

else

{

*e=T[0];

return 1;

}

}

// 返回处于位置e(层,本层序号)的结点的值

TElemType Value(SqBiTree T,position e)

{

// 将层、本层序号转为矩阵的序号

return T[((i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值