二叉树的顺序存储(数组实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37345402/article/details/87304039

递归方式实现:

ABCDE^F^^G
————————————————————————————△深度和长度
此时T的长度为:10,深度为:4
————————————————————————————△层序遍历
A B C D E F G
————————————————————————————△前序遍历
A B D E G C F
————————————————————————————△中序遍历
D B G E A C F
————————————————————————————△后序遍历
D G E B F C A

#include<stdio.h>
#include<stdlib.h> 
#include<cmath>
#define MAX_TREE_SIZE 100//二叉树的最大结点数 
typedef char ElemType;
typedef ElemType SqBiTree[MAX_TREE_SIZE];//0号单元存储根节点
typedef struct{
	int level;//结点所在层 
	int order;//结点在本层序号(按完全二叉树计算) 
}Pos; 
//1.构造空二叉树T
void InitBiTree_Sq(SqBiTree &T){
	for(int i=0;i<MAX_TREE_SIZE;i++){
		T[i]='\0';//空树无结点,以空字符填充数组 
	}
}
//5.按层序序列构造二叉树
void CreateBiTree_Le_Sq(SqBiTree &T){
	char ch;
	int i=0;
	while(1){
		ch=getchar();
		if(ch=='\n')break;
		if(ch=='^'){
			T[i++]='\0';
		}else{
			T[i++]=ch;
		}
	}
}
//7.返回二叉树长度
int BiTreeLength_Sq(SqBiTree T){
	int len; 
	for(len=MAX_TREE_SIZE;len-1>=0;len--){
		if(T[len-1]!='\0'){
			break;
		}
	}
	return len;
} 
//8.返回二叉树深度(层数)
BiTreeDepth_Sq(SqBiTree T){
	int level=0;
	while((int)pow(2,level)-1<BiTreeLength_Sq(T)){
		level++;
	}
	return level;
}
//17.层次遍历二叉树 
void LevelOrderTraverse_Sq(SqBiTree T){
	int len=BiTreeLength_Sq(T);
	for(int i=0;i<len;i++){
		if(T[i]!='\0'){
			printf("%c ",T[i]);
		}
	}
	printf("\n");
}
//18.前序遍历二叉树
void PreOrderTraverse_Sq(SqBiTree T,int i){
	if(T[i]!='\0'){
		printf("%c ",T[i]);
		PreOrderTraverse_Sq(T,2*i+1);
		PreOrderTraverse_Sq(T,2*i+2);
	} 
}
//19.中序遍历二叉树
void InOrderTraverse_Sq(SqBiTree T,int i){
	if(T[i]!='\0'){
		InOrderTraverse_Sq(T,2*i+1);
		printf("%c ",T[i]);
		InOrderTraverse_Sq(T,2*i+2);
	} 
} 
//20.后序遍历二叉树
void PostOrderTraverse_Sq(SqBiTree T,int i){
	if(T[i]!='\0'){
		PostOrderTraverse_Sq(T,2*i+1);
		PostOrderTraverse_Sq(T,2*i+2);
		printf("%c ",T[i]);
	} 
}
int main(){
	SqBiTree T;
	printf("————————————————————————————△初始化空二叉树\n");
	InitBiTree_Sq(T);//初始化 
	printf("————————————————————————————△层次序列创建\n");
	CreateBiTree_Le_Sq(T);
	printf("————————————————————————————△深度和长度\n");
	printf("此时T的长度为:%d,深度为:%d\n",BiTreeLength_Sq(T),BiTreeDepth_Sq(T));
	int len=BiTreeLength_Sq(T);
	printf("————————————————————————————△层序遍历\n");
	LevelOrderTraverse_Sq(T);
	printf("————————————————————————————△前序遍历\n");
	PreOrderTraverse_Sq(T,0);
	printf("\n");
	printf("————————————————————————————△中序遍历\n");
	InOrderTraverse_Sq(T,0);
	printf("\n");
	printf("————————————————————————————△后序遍历\n");
	PostOrderTraverse_Sq(T,0);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/m0_37345402/article/details/87304039