本题要求给定二叉树的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
AC代码
void InorderTraversal(BinTree bt)/
{
if (bt == NULL){
return;
} //递归调用的结束条件
else {
InorderTraversal(bt->Left);
printf(" %c",bt->Data); //前序递归遍历bt的左子树
InorderTraversal(bt->Right); //前序递归遍历bt的右子树
}
}
void PreorderTraversal(BinTree bt)///
{
if (bt == NULL){
return;
} //递归调用的结束条件
else {
printf(" %c",bt->Data);
PreorderTraversal(bt->Left); //前序递归遍历bt的左子树
PreorderTraversal(bt->Right); //前序递归遍历bt的右子树
}
}
void PostorderTraversal(BinTree bt)
{
if (bt == NULL){
return;
} //递归调用的结束条件
else {
PostorderTraversal(bt->Left); //前序递归遍历bt的左子树
PostorderTraversal(bt->Right);
printf(" %c",bt->Data); //前序递归遍历bt的右子树
}
}
void LevelorderTraversal(BinTree bt)
{
BinTree Q[100], q = NULL; //顺序队列最多100个结点
int front = -1, rear = -1; //队列初始化
if (bt == NULL) return; //二叉树为空,算法结束
Q[++rear] = bt; //根指针入队
while (front != rear) //当队列非空时
{
q = Q[++front];
printf(" %c",q->Data);
if (q->Left!= NULL) Q[++rear] = q->Left;
if (q->Right != NULL) Q[++rear] = q->Right;
}
}
嗯,参考课本代码
**
附赠一个还算能用的CreatBinTree函数
**
BinTree CreatBinTree(BinTree bt){
//BinTree bt;
char ch;
//cout << "请输入扩展二叉树的前序遍历序列,每次输入一个字符:";
scanf("%c",&ch);
if (ch == '#') bt = nullptr;
else {
bt = new TNode;
bt->Data = ch;
bt->Left= CreatBinTree(bt->Left);
bt->Right = CreatBinTree(bt->Right);
}
return bt;
}
↑ 就是 裁判测试程序样例的 /* 实现细节忽略 */ 的代码
- 方便自行运行测试
- 需要将主函数的
BinTree BT = CreatBinTree();
- 改成
BinTree BT = CreatBinTree(BT);
- 例如图片那棵树要输入
- ABD##FE###CG#H##I##