学习二叉树层序遍历:代码实现与详细解析

刚学完二叉树的层序遍历时,我对着课本上的示意图发呆了半小时——明明知道是按一层一层的顺序遍历,但代码就是写不出来。直到自己动手把队列和二叉树结合起来调试,才真正理解了"队列是层序遍历的灵魂"这句话。今天就把我的学习过程整理成这篇实战笔记,手把手教你在C语言中实现这个看似简单实则暗藏玄机的算法!

一、层序遍历的"灵魂画手":队列

当我们面对如下的二叉树时:

                                      

层序遍历的结果应该是:1 2 4 3 5 6。要实现这种"按层扫描"的效果,队列这个数据结构就是关键。它的先进先出(FIFO)特性完美契合了层序遍历的需求:

  1. 根节点入队

  2. 取出队首节点并访问

  3. 将其左右子节点依次入队

  4. 重复上述步骤直到队列为空

二、从零搭建基础结构

2.1 二叉树节点设计

就像搭积木要先准备零件,我们首先定义二叉树节点:

typedef int BTDataType;
typedef struct BinaryTreeNode {
    BTDataType data;
    struct BinaryTreeNode* left;
    struct BinaryTreeNode* right;
} BTNode;
2.2 队列的定制化实现

由于C语言标准库没有现成的队列,我们需要自己造轮子:

typedef struct BinaryTreeNode* QDataType;

typedef struct QueueNode {
    QDataType data;
    struct QueueNode* next;
} QNode;

typedef struct Queue {
    QNode* head;
    QNode* tail;
    int size;
} Queue;

 这里有个设计亮点:队列中存储的是二叉树节点的指针,这样既节省空间又方便操作。队列的初始化、入队、出队操作就像流水线上的传送带,确保节点按顺序处理。

三、核心算法实现详解

3.1 创建测试二叉树

我们先手动搭建一个二叉树来测试代码:

BTNode* CreatTree() {
    BTNode* node1 = BuyNode(1);
    // 其他节点创建省略...
    node1->left = node2;
    node1->right = node4;
    node2->left = node3;
    node4->left = node5;
    node4->right = node6;
    return node1;
}

 这个二叉树的结构示意图如下:

                                                  

 

3.2 层序遍历的魔法时刻

最关键的层序遍历函数:

​
void LevelOrder(BTNode* root) {
    Queue q;
    QueueInit(&q);
    
    if (root)
    {
	    QueuePush(&q, root);
    }

    while (!QueueEmpty(&q)) {
        BTNode* front = QueueFront(&q);
        QueuePop(&q);
        printf("%d ", front->data);

        if (front->left) QueuePush(&q, front->left);
        if (front->right) QueuePush(&q, front->right);
    }
    QueueDestroy(&q);
}

​

运行过程分解:

  1. 初始状态:队列中只有根节点1

  2. 第一轮循环:取出1,打印后把2和4入队

  3. 第二轮循环:取出2,打印后把3入队

  4. 第三轮循环:取出4,打印后把5、6入队

  5. 后续循环依次处理剩余节点...

四、避坑指南:常见问题分析

  1. 内存泄漏问题
    代码中特别加入了DestroyTree函数,通过递归释放所有节点。忘记释放内存是新手常犯的错误,务必养成"有malloc就有free"的习惯!

  2. 队列空指针判断
    QueueFrontQueuePop操作前都要检查队列是否为空,否则会出现野指针访问。这里的断言就像代码的安全气囊。

  3. 层级关系维护
    为什么要先处理左孩子再处理右孩子?这保证了同层节点从左到右的顺序,如果调换顺序就会得到错误的结果。

完整代码已同步到Gitee仓库:https://gitee.com/roaring-black-fertilizer/initial-data-structurehttps://gitee.com/roaring-black-fertilizer/initial-data-structure/commit/e3a2a005ff46aae226cdaa497d3bcc85a109918c 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值