6-2 二叉树的层次遍历

作者 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);
        }
    }
}
相关推荐
强哥聊算力5 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
Navigator_Z9 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy9 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
YangYang9YangYan11 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法
jsjzsl211 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
程序员清风11 小时前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
梦帮科技11 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
171320330计算机毕设编程12 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
姜鱼问生12 小时前
Nginx gzip 压缩:一个配置让页面加载快 3 倍
后端·算法·架构