2022.11.19
任务描述
本关任务:以顺序结构存储二叉树,编写前序、中序、后序及层次顺序遍历二叉树的算法,并计算二叉树深度、所有结点总数。
相关知识
回去看题吧太长了。二叉树的顺序存储及基本操作
编程要求
测试说明
平台会对你编写的代码进行测试:
测试输入:ABCDEF###G##H
预期输出:
按先序遍历的结果为:ABDEGCFH
按中序遍历的结果为:DBGEAFHC
按后序遍历的结果为:DGEBHFCA
按层序遍历的遍历结果为:ABCDEFGH
该二叉树的高度为:4
开始你的任务吧,祝你成功!
C/C++代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std;
#define OK 1
#define ERROR 0
#define MAX_TREE_SIZE 100
typedef char TElemType ;
typedef TElemType SqBiTree[MAX_TREE_SIZE];
TElemType Nil='#';
void input(TElemType &x) // 函数变量
{
scanf("%c",&x);
}
void visit(TElemType x) // 函数变量
{
printf("%c",x);
}
void InitBiTree(SqBiTree &T)
{ // 构造空二叉树T。因为T是数组名,故不需要&
int i;
for(i=0;i<MAX_TREE_SIZE;i++)
T[i]=Nil; // 初值为空(Nil在主程中定义)
}
void CreateBiTree(SqBiTree &T)
{ // 按层序次序输入二叉树中结点的值(字符型或整型), 构造顺序存储的二叉树T
/********** Begin **********/
int i=1;
scanf("%s",T+1);
while(T[i] != '\0')
i++;
T[i]='#';
/********** End **********/
}
int BiTreeEmpty(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:若T为空二叉树,则返回TRUE,否则FALSE
if(T[1]==Nil) // 根结点为空,则树空
return 1;
else
return 0;
}
int BiTreeDepth(SqBiTree T)
{ // 初始条件:二叉树T存在。操作结果:返回T的深度
/********** Begin **********/
int i=MAX_TREE_SIZE-1,j;
while(T[i]=='#')
i--;
j=i;
int dep=0;
do{
dep++;
j=j/2;
}while(j>=1);
return dep;
/********** End **********/
}
void PreTraverse(SqBiTree T,int e)
{ // PreOrderTraverse()调用
/********** Begin **********/
if(T[e] != '#'){
visit(T[e]);
PreTraverse(T,2*e);
PreTraverse(T,2*e+1);
}
/********** End **********/
}
void PreOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
// 操作结果:先序遍历T,对每个结点调用函数Visit一次且仅一次
if(!BiTreeEmpty(T)) // 树不空
PreTraverse(T,1);
printf("\n");
}
void InTraverse(SqBiTree T,int e)
{ // InOrderTraverse()调用
/********** Begin **********/
if(T[e] != '#'){
InTraverse(T,2*e);
visit(T[e]);
InTraverse(T,2*e+1);
}
/********** End **********/
}
void InOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树存在,Visit是对结点操作的应用函数
// 操作结果:中序遍历T,对每个结点调用函数Visit一次且仅一次
if(!BiTreeEmpty(T)) // 树不空
InTraverse(T,1);
printf("\n");
}
void PostTraverse(SqBiTree T,int e)
{ // PostOrderTraverse()调用
/********** Begin **********/
if(T[e] != '#'){
PostTraverse(T,2*e);
PostTraverse(T,2*e+1);
visit(T[e]);
}
/********** End **********/
}
void PostOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
// 操作结果:后序遍历T,对每个结点调用函数Visit一次且仅一次
if(!BiTreeEmpty(T)) // 树不空
PostTraverse(T,1);
printf("\n");
}
void LevelOrderTraverse(SqBiTree T,void(*Visit)(TElemType))
{ // 层序遍历二叉树
/********** Begin **********/
int dep=BiTreeDepth(T);
int tree_max=pow(dep,2)-1;
for(int i=1;i<tree_max;i++){
if(T[i]=='#')
continue;
visit(T[i]);
}
/********** End **********/
}
int main()
{
TElemType e;
SqBiTree Bt;
InitBiTree(Bt);
CreateBiTree(Bt);
printf("按先序遍历的结果为:");
PreOrderTraverse(Bt,visit);
printf("按中序遍历的结果为:");
InOrderTraverse(Bt,visit);
printf("按后序遍历的结果为:");
PostOrderTraverse(Bt,visit);
printf("按层序遍历的遍历结果为:");
LevelOrderTraverse(Bt,visit);
printf("\n该二叉树的高度为:%d",BiTreeDepth(Bt) );
return 0;
}