作者 DS课程组
单位 临沂大学
本题要求实现给定的二叉树的层次遍历。
函数接口定义:
void Levelorder(BiTree T);
T是二叉树树根指针,Levelorder函数输出给定二叉树的层次遍历序列,格式为一个空格跟着一个字符。
其中BinTree结构定义如下:
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Create();/* 细节在此不表 */
void Levelorder(BiTree T);
int main()
{
BiTree T = Create();
printf("Levelorder:"); Levelorder(T); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
输入为由字母和'#'组成的字符串,代表二叉树的扩展先序序列。例如对于如下二叉树,输入数据:
AB#DF##G##C##
输出样例(对于图中给出的树):
Levelorder: A B C D F G
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C程序如下:
cs
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct BiTNode {
char data;
struct BiTNode* lchild;
struct BiTNode* rchild;
} BiTNode, *BiTree;
// 定义队列节点结构体
typedef struct QueenNode {
struct BiTNode* treeNode;
struct QueenNode* next;
} QueenNode;
// 定义队列结构体
typedef struct Queen {
struct QueenNode *front, *rear;
} Queen;
// 创建空队列
Queen* CreatQueen() {
// 分配内存并初始化队列
Queen* p = (Queen*)malloc(sizeof(struct Queen));
p->front = p->rear = NULL;
return p;
}
// 入队操作
void enqueen(BiTree treeNode, Queen* q) {
// 分配内存并创建新的队列节点
QueenNode* p = (QueenNode*)malloc(sizeof(struct QueenNode));
p->treeNode = treeNode;
p->next = NULL;
// 如果队列为空,初始化队列的头和尾
if (q->rear == NULL) {
q->front = q->rear = p;
return;
}
// 否则,将新节点添加到队列尾部
q->rear->next = p;
q->rear = p;
}
// 出队操作
BiTree dequeen(Queen* q) {
// 如果队列为空,返回 NULL
if (q->front == NULL) {
return NULL;
}
// 获取队列头节点的数据
BiTree treeNode = q->front->treeNode;
// 临时保存队列头节点指针以便释放内存
QueenNode* p = q->front;
// 更新队列头指针
q->front = q->front->next;
// 如果队列头为空,更新队列尾指针
if (q->front == NULL) {
q->rear = NULL;
}
// 释放内存并返回出队的数据
free(p);
return treeNode;
}
// 判断队列是否为空
int isEmpty(Queen* q) {
// 如果队列头为空,返回1,否则返回0
return q->front == NULL ? 1 : 0;
}
// 层次遍历二叉树
void Levelorder(BiTree T) {
// 如果树为空,直接返回
if (T == NULL) {
return;
}
// 创建空队列
Queen *q = CreatQueen();
// 将根节点入队
enqueen(T, q);
// 当队列不为空时,进行循环
while (!isEmpty(q)) {
// 出队一个节点并打印节点数据
BiTree tree = dequeen(q);
printf(" %c", tree->data);
// 将左子节点入队
if (tree->lchild != NULL) {
enqueen(tree->lchild, q);
}
// 将右子节点入队
if (tree->rchild != NULL) {
enqueen(tree->rchild, q);
}
}
}