c语言二叉树的层次遍历
作者:野牛程序员:2024-01-03 21:48:37C语言阅读 2772
      使用队列实现C语言中二叉树的层次遍历。下面是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点
struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
};
// 定义队列节点
struct QueueNode {
    struct TreeNode* data;
    struct QueueNode* next;
};
// 定义队列
struct Queue {
    struct QueueNode* front;
    struct QueueNode* rear;
};
// 初始化队列
void initializeQueue(struct Queue* q) {
    q->front = q->rear = NULL;
}
// 检查队列是否为空
int isQueueEmpty(struct Queue* q) {
    return (q->front == NULL);
}
// 入队列
void enqueue(struct Queue* q, struct TreeNode* node) {
    struct QueueNode* newNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));
    newNode->data = node;
    newNode->next = NULL;
    if (q->rear == NULL) {
        q->front = q->rear = newNode;
    } else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}
// 出队列
struct TreeNode* dequeue(struct Queue* q) {
    if (isQueueEmpty(q)) {
        return NULL;
    }
    struct QueueNode* temp = q->front;
    struct TreeNode* node = temp->data;
    q->front = q->front->next;
    free(temp);
    if (q->front == NULL) {
        q->rear = NULL;
    }
    return node;
}
// 层次遍历二叉树
void levelOrderTraversal(struct TreeNode* root) {
    if (root == NULL) {
        return;
    }
    struct Queue q;
    initializeQueue(&q);
    enqueue(&q, root);
    while (!isQueueEmpty(&q)) {
        struct TreeNode* current = dequeue(&q);
        printf("%d ", current->data);
        if (current->left != NULL) {
            enqueue(&q, current->left);
        }
        if (current->right != NULL) {
            enqueue(&q, current->right);
        }
    }
}
// 测试
int main() {
    // 构建一个简单的二叉树
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->data = 1;
    root->left = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->left->data = 2;
    root->left->left = root->left->right = NULL;
    root->right = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->right->data = 3;
    root->right->left = root->right->right = NULL;
    // 进行层次遍历
    printf("层次遍历结果: ");
    levelOrderTraversal(root);
    // 释放内存
    free(root->left);
    free(root->right);
    free(root);
    return 0;
}野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
        
- 上一篇:c++二叉树的层次遍历
 - 下一篇:c二叉树的后序遍历(非递归)
 
