递归方式实现:
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;
}