队列应用:遍历二叉树

#include <stdio.h>
#include <stdlib.h>

// 定义二叉树节点结构
struct TreeNode {
    int value;
    struct TreeNode *left;
    struct TreeNode *right;
};

// 定义队列结构
struct QueueNode {
    struct TreeNode *node;
    struct QueueNode *next;
};

struct Queue {
    struct QueueNode *front;
    struct QueueNode *rear;
};

// 创建二叉树节点
struct TreeNode* create_node(int value) {
    struct TreeNode *new_node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    new_node->value = value;
    new_node->left = NULL;
    new_node->right = NULL;
    return new_node;
}

// 初始化队列
struct Queue* create_queue() {
    struct Queue *queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->front = NULL;
    queue->rear = NULL;
    return queue;
}

// 判断队列是否为空
int is_empty(struct Queue *queue) {
    return queue->front == NULL;
}

// 入队操作
void enqueue(struct Queue *queue, struct TreeNode *node) {
    struct QueueNode *new_node = (struct QueueNode*)malloc(sizeof(struct QueueNode));
    new_node->node = node;
    new_node->next = NULL;
    if (is_empty(queue)) {
        queue->front = new_node;
        queue->rear = new_node;
    } else {
        queue->rear->next = new_node;
        queue->rear = new_node;
    }
}

// 出队操作
struct TreeNode* dequeue(struct Queue *queue) {
    if (is_empty(queue)) {
        return NULL;
    }
    struct QueueNode *temp = queue->front;
    struct TreeNode *node = temp->node;
    queue->front = queue->front->next;
    if (queue->front == NULL) {
        queue->rear = NULL;
    }
    free(temp);
    return node;
}

// 释放队列内存
void free_queue(struct Queue *queue) {
    while (!is_empty(queue)) {
        dequeue(queue);
    }
    free(queue);
}

// 层序遍历二叉树
void level_order_traversal(struct TreeNode *root) {
    if (root == NULL) {
        return;
    }

    struct Queue *queue = create_queue();  // 创建队列
    enqueue(queue, root);  // 将根节点入队

    while (!is_empty(queue)) {
        struct TreeNode *current_node = dequeue(queue);  // 从队列中取出节点
        printf("%d ", current_node->value);  // 访问节点

        // 将左子节点入队
        if (current_node->left != NULL) {
            enqueue(queue, current_node->left);
        }
        // 将右子节点入队
        if (current_node->right != NULL) {
            enqueue(queue, current_node->right);
        }
    }

    free_queue(queue);  // 释放队列内存
}

// 主函数示例
int main() {
    // 创建一个简单的二叉树
    struct TreeNode *root = create_node(1);
    root->left = create_node(2);
    root->right = create_node(3);
    root->left->left = create_node(4);
    root->left->right = create_node(5);
    root->right->right = create_node(6);

    printf("层序遍历结果: ");
    level_order_traversal(root);  // 执行层序遍历

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值