版权声明:转载请注明出处。 https://blog.csdn.net/baidu_38304645/article/details/82980516
将二叉树映射到完全二叉树上,不存在的结点以空标记,之后用地址连续的存储单元(一维数组)从上至下,自左到右,存储完全二叉树上的各元素,(将一般二叉树以完全二叉树形式存储),最坏情况下k个结点需2^k-1个单元,但适合完全二叉树的存储,操作简单方便。
首先是辅助宏的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
#define NULL 0
#define TREE_SIZE 100
#define TREEINCREMENT 10
typedef int Status;
typedef char TElemType;
二叉树的顺序存储结构定义:
//二叉树的顺序存储结构定义
typedef struct{
TElemType *base;
int TreeSize;
int length;
}SqBiTree;
二叉树的初始化:
Status InitBiTree_Sq(SqBiTree &T){
//二叉树的初始化
T.base=(TElemType *)malloc(TREE_SIZE*sizeof(TElemType));
if(!T.base)//存储分配失败
exit(OVERFLOW);
T.TreeSize=TREE_SIZE;
T.length=0;
return OK;
}
创建一个二叉树.
Status CreatBiTree(SqBiTree &T){
//创建一个二叉树
int i;
TElemType e;
printf("请按照层次从左到右的顺序输入二叉树,空节点用空格表示,结束时按回车:\n");
while((e=getchar())!='\n'){
if(T.length>=T.TreeSize){ //二叉树满时扩充
T.base=(TElemType *)realloc(T.base,(T.TreeSize+TREEINCREMENT)*sizeof(TElemType));
if(!T.base)
exit(OVERFLOW);
T.TreeSize+=TREEINCREMENT;
}
T.base[T.length++]=e;//长度加一
}
return OK;
}
从树T中返回i位置的左孩子 i不合法或者左孩子不存在返回空格.
TElemType LeftChild(SqBiTree T,int i){
//从树T中返回i位置的左孩子 i不合法或者左孩子不存在返回空格
if(i*2-1>=T.length||i<1)
return ' ';
return T.base[i*2-1];
}
从树T中返回i位置的右孩子 i不合法或者右孩子不存在返回空格.
TElemType RightChild(SqBiTree T,int i){
//从树T中返回i位置的右孩子 i不合法或者右孩子不存在返回空格
if(i*2>=T.length||i<1)
return ' ';
return T.base[i*2];
}
从树T中返回i位置的双亲 i不合法或者双亲不存在返回空格.
TElemType Parent(SqBiTree T,int i){
//从树T中返回i位置的双亲 i不合法或者双亲不存在返回空格
if(i/2-1<0||i>T.length)
return ' ';
return T.base[i/2-1];
}