使用层序遍历创建一个二叉树
2021/11/1 23:41:02
本文主要是介绍使用层序遍历创建一个二叉树,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
// // 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; }
这篇关于使用层序遍历创建一个二叉树的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26JavaScript入门教程:从零开始学习JavaScript编程
- 2024-12-26JavaScript入门教程:从零开始学习JavaScript
- 2024-12-26JS编程入门指南:从零开始学习JavaScript
- 2024-12-25Java编程面试题详解与解答
- 2024-12-25TS基础知识详解:初学者必看教程
- 2024-12-252024面试题解析与攻略:从零开始的面试准备指南
- 2024-12-25数据结构与算法学习:新手入门教程
- 2024-12-25初学者必备:订单系统资料详解与实操教程
- 2024-12-24内网穿透资料入门教程
- 2024-12-24微服务资料入门指南