数据结构-顺序二叉树

版权声明:转载请注明出处。 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];
}

猜你喜欢

转载自blog.csdn.net/baidu_38304645/article/details/82980516