PTA是浙江大学设计类实验辅助教学平台。
题目描述:
本题要求给定二叉树的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 LevelorderTraversal( BinTree BT ){
if (!BT) return;
BinTree que[1000],p;
int front=0,rear=0;
que[rear++]=BT;
while (front!=rear)
{
p=que[front++];
printf(" %c",p->Data);
if (p->Left) que[rear++]=p->Left;
if (p->Right) que[rear++]=p->Right;
}
}
我们不妨多做一步,创建二叉树,亲自看到运行的结果。
我们将题目中CreateBinTree()稍稍做一下修改。
void CreatBinTree(BinTree &BT);
void CreatBinTree(BinTree &BT){
char ch;
scanf("%c",&ch);
if (ch=='#')
{
BT=NULL;
}
else
{
BT=(BinTree)malloc(sizeof(BinTree));
BT->Data=ch;
CreatBinTree(BT->Left);
CreatBinTree(BT->Right);
}
}
完整代码
#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 CreatBinTree(BinTree &BT); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int main()
{
BinTree BT;
CreatBinTree(BT);
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;
}
/* 你的代码将被嵌在这里 */
void InorderTraversal( BinTree BT ){
if (!BT) return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){
if (!BT) return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){
if (!BT) return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
if (!BT) return;
BinTree que[1000],p;
int front=0,rear=0;
que[rear++]=BT;
while (front!=rear)
{
p=que[front++];
printf(" %c",p->Data);
if (p->Left) que[rear++]=p->Left;
if (p->Right) que[rear++]=p->Right;
}
}
void CreatBinTree(BinTree &BT){
char ch;
scanf("%c",&ch);
if (ch=='#')
{
BT=NULL;
}
else
{
BT=(BinTree)malloc(sizeof(BinTree));
BT->Data=ch;
CreatBinTree(BT->Left);
CreatBinTree(BT->Right);
}
}
输入
输入的时候略有讲究:
我画一张图,让你看就懂
所以我们只需要先序遍历二叉树,确定输入的顺序。
输入顺序:
ABD##FE###CG#H##I##
我们来运行一把
很好,这就是我心目中想要的结果。
编译器
C(gcc)
提交代码
void InorderTraversal( BinTree BT ){
if (!BT) return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){
if (!BT) return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){
if (!BT) return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
void LevelorderTraversal( BinTree BT ){
if (!BT) return;
BinTree que[1000],p;
int front=0,rear=0;
que[rear++]=BT;
while (front!=rear)
{
p=que[front++];
printf(" %c",p->Data);
if (p->Left) que[rear++]=p->Left;
if (p->Right) que[rear++]=p->Right;
}
}
运行截图
提交结果
Nice!Nice!Nice!
搞定!