本题要求给定二叉树的4种遍历。
函数接口定义:
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
其中BinTree结构定义如下:
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输出样例(对于图中给出的树):
Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H
void InorderTraversal( BinTree BT )//中序
{
if(BT==NULL)
{
return;
}
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT )//前序
{
if(BT==NULL)
{
return;
}
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT )//后序
{
if(BT==NULL)
{
return;
}
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT )//层序
{
Position queue[10];//顺序存储
Position record=NULL;//保存要打印的
int rear=0;
int front=0;
if(BT==NULL)
return ;
else
{
queue[rear]=BT;//BT不空就入队
rear=(rear+1)%10;//循环队列
while(front!=rear)//队列不空就打印并加上它的左右儿子
{
record=queue[front];
front=(front+1)%10;
printf(" %c",record->Data);
if(record->Left)
{
queue[rear]=record->Left;
rear=(rear+1)%10;
}
if(record->Right)
{
queue[rear]=record->Right;
rear=(rear+1)%10;
}
}
}
}
开始,层序也不会写,参见了这位的博客
dgyzmyx_
完整代码
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
void Delete(BinTree BT);
BinTree CreatBinTree(void);
int main()
{
BinTree BT = CreatBinTree();
printf("Inorder:");
InorderTraversal(BT);
printf("\n");
printf("Preorder:");
PreorderTraversal(BT);
printf("\n");
printf("Postorder:");
PostorderTraversal(BT);
printf("\n");
printf("Levelorder:");
LevelorderTraversal(BT);
printf("\n");
Delete(BT);
return 0;
}
/* 你的代码将被嵌在这里 */
void Delete(BinTree BT)
{
if(BT==NULL)
return ;
Delete(BT->Left);
Delete(BT->Right);
free(BT);
}
BinTree CreatBinTree(void)
{
Position T=(Position)malloc(sizeof(struct TNode));
if(!T)
{
puts("It's full");
exit(EXIT_FAILURE);
}
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T->Data=ch;
T->Left=T->Right=NULL;
T->Left=CreatBinTree();
T->Right=CreatBinTree();
}
return T;
}
void InorderTraversal( BinTree BT )//中序
{
if(BT==NULL)
{
return;
}
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT )//前序
{
if(BT==NULL)
{
return;
}
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT )//后序
{
if(BT==NULL)
{
return;
}
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT )//层序
{
Position queue[10];//顺序存储
Position record=NULL;//保存要打印的
int rear=0;
int front=0;
if(BT==NULL)
return ;
else
{
queue[rear]=BT;//BT不空就入队
rear=(rear+1)%10;//循环队列
while(front!=rear)//队列不空就打印并加上它的左右儿子
{
record=queue[front];
front=(front+1)%10;
printf(" %c",record->Data);
if(record->Left)
{
queue[rear]=record->Left;
rear=(rear+1)%10;
}
if(record->Right)
{
queue[rear]=record->Right;
rear=(rear+1)%10;
}
}
}
}
输入按先序,图例中,如此输入
ABD##FE###CG#H##I##