本题要求给定二叉树的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 )
{
InorderTraversal( BT->Left );
printf(" %c", BT->Data);
InorderTraversal( BT->Right );
}
}
void PreorderTraversal( BinTree BT )
{
if( BT )
{
printf(" %c", BT->Data);
PreorderTraversal( BT->Left );
PreorderTraversal( BT->Right );
}
}
void PostorderTraversal( BinTree BT )
{
if( BT )
{
PostorderTraversal( BT->Left );
PostorderTraversal( BT->Right );
printf(" %c", BT->Data);
}
}
void LevelorderTraversal( BinTree BT ) //用队列存储节点
{
BinTree queue[100], tree; //queue是一个二叉树队列(数组)
int front, rear; //队列头尾指针
if( BT ) //根节点不空
{
queue[rear++] = BT; //入队
while( front != rear ) //若队列不空
{
tree = queue[front++]; //令tree指向即将出队的节点,然后该节点出队
printf(" %c", tree->Data);
if( tree->Left ) //出队节点有左子树
{
queue[rear++] = tree->Left; //出队节点的左子树入队
}
if( tree->Right ) //出队节点有右子树
{
queue[rear++] = tree->Right; //出队节点的右子树入队
}
}
}
}