其他分享
首页 > 其他分享> > 使用层序遍历创建一个二叉树

使用层序遍历创建一个二叉树

作者:互联网

//
// Created by zhuoL on 2021/11/1.
//

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

//树节点
typedef struct TreeNode {
    struct TreeNode *left, *right;
    char data;
} TreeNode, *pTreeNode;
//队列节点
typedef struct QueueNode {
    TreeNode *data;
    struct QueueNode *next;
} QueueNode, *pQueueNode;
//队列
typedef struct Queue {
    pQueueNode front, rear;
} Queue, *pQueue;

///先序遍历输入一棵二叉树(使用一级指针创建)
TreeNode *createBiTree(TreeNode *root) {
    char ch;
    scanf("%c", &ch);
    if (ch == '.') {
        return NULL;
    }
    root = malloc(sizeof(TreeNode));
    root->data = ch;
    root->left = createBiTree(root);
    root->right = createBiTree(root);
    return root;
}

///建立只有头结点的队列
Queue *initQ(Queue *queueNode) {
    queueNode->front = (pQueueNode) malloc(sizeof(QueueNode));
    if (queueNode->front == NULL)//判断内存分配是否成功
    {
        printf("内存分配不成功!");
    } else {
        queueNode->front->next = NULL;//队列的front和rear的next初始化为空
        queueNode->rear = queueNode->front;
        return queueNode;
    }
}

///把二叉树的数据取出放入队列
void enqueue(Queue *queueNode, TreeNode *data) {
    QueueNode *newNode = malloc(sizeof(QueueNode));
    newNode->data = data;//二叉树的数据存入队列
    newNode->next = NULL;
    queueNode->rear->next = newNode;//尾插法建立连接
    queueNode->rear = newNode;//rear更新
}

///出队:删除队列第一个元素
TreeNode *dequeue(Queue *queueNode) {
    QueueNode *pTemp = (pQueueNode) malloc(sizeof(QueueNode));
    pTemp = queueNode->front->next;
    //只剩下1个节点(不含队列空的头结点)
    if (pTemp->next == NULL) {
        queueNode->rear = queueNode->front;
    } else {
        queueNode->front->next = pTemp->next;//front+1(从指向第1个非空节点改为指向第2个节点)
    }
    TreeNode *x;
    x = pTemp->data;//x为队列第一个元素的data
    free(pTemp);
    return x;
}

/层序输出
/**
 * 1.初始化并创建一个队列
 * 2.让二叉树的根节点入队
 * 3.当队列不为空时元素出队并将出队节点的左右孩子入队(当他们不为NULL时)
 * 4.重复步骤二三直至队列为空
 * @param root 
 */
void LevelOrderBiTree(TreeNode *root) {
    ///初始化并创建一个队列
    Queue *queueNode = malloc(sizeof(Queue));
    queueNode = initQ(queueNode);
    ///取出二叉树的根节点,子节点存入队列
    enqueue(queueNode, root);
    ///当队列不为空
    while (queueNode->rear != queueNode->front) {
        TreeNode *x = dequeue(queueNode);//x用于输出队列弹出元素的数据
        printf("%-2c", x->data);
        if (x->left != NULL) {
            enqueue(queueNode, x->left);//递归左节点
        }
        if (x->right != NULL) {
            enqueue(queueNode, x->right);//递归右节点
        }
    }
}

int main() {
    TreeNode *root = createBiTree(root);
    LevelOrderBiTree(root);
    return 0;
}

标签:遍历,TreeNode,队列,root,层序,next,二叉树,front,queueNode
来源: https://blog.csdn.net/weixin_42948205/article/details/121091346