本题要求给定二叉树的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
代码如下:
#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;
}
/* 你的代码将被嵌在这里 */
BinTree CreatBinTree()
{//层序生成二叉树
BinTree BT;
ElementType T;
int front = 0;
int tail = 0;
BinTree Queue[1001] = { '\0' };//父节点数列,'\0'是字符串结束标志
BinTree Date;
scanf("%c", &T);
if (T == '0')//空树
{
return NULL;
}
else
{
BT = (BinTree)malloc(sizeof(struct TNode));
if (BT == NULL)
{
return NULL;
}
BT->Data = T;//根节点赋值
BT->Left = BT->Right = NULL;//初始化左右子树
Queue[tail++] = BT;//给父节点数列加树
}
while (Queue[front]!=NULL)//根节点入队列
{
Date = Queue[front++];
scanf("%c", &T);
if (T == '0')
{
Date->Left = NULL;
}
else
{
Date->Left = (BinTree)malloc(sizeof(struct TNode));
if (Date->Left == NULL)//先完成左树的操作,然后完成右树的操作
{
return NULL;
}
Date->Left->Data = T;
Date->Left->Left = Date->Left->Right = NULL;
Queue[tail++] = Date->Left;
}
scanf("%c", &T);
if (T == '0')
{
Date->Right = NULL;
}
else
{
Date->Right = (BinTree)malloc(sizeof(struct TNode));
if (Date->Left == NULL)//先完成左树的操作,然后完成右树的操作
{
return NULL;
}
Date->Right->Data = T;
Date->Right->Left = Date->Right->Right = NULL;
Queue[tail++] = Date->Right;
}
}
return BT;
}
void InorderTraversal(BinTree BT)//前序遍历,直接递归即可
{
if (BT != NULL)
{
InorderTraversal(BT->Left);
printf(" %c", BT->Data);
InorderTraversal(BT->Right);
}
}
void PreorderTraversal(BinTree BT)//中序遍历
{
if (BT != NULL)
{
printf(" %c", BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
void PostorderTraversal(BinTree BT)//后序遍历
{
if (BT != NULL)
{
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c", BT->Data);
}
}
void LevelorderTraversal(BinTree BT)//层次遍历
{
if (BT != NULL)
{
BinTree binTree[100];
int head = 0, last = 0;
binTree[last++] = BT;
while (head < last)
{
BinTree temp = binTree[head++];
printf(" %c", temp->Data);
if (temp->Left)
{
binTree[last++] = temp->Left;
}
if (temp->Right)
{
binTree[last++] = temp->Right;
}
}
}
}