#include <stdio.h> #include <malloc.h> #include <stdbool.h> #define QUEUE_SIZE 5 /** * 二叉树结点 */ typedef struct BTNode { char element; struct BTNode* left; struct BTNode* right; } BTNode, *BTNodePtr; /** * 存储若干指针的队列 */ typedef struct BTNodePtrQueue { BTNodePtr* nodePtrs; int front; int rear; } BTNodePtrQueue, *QueuePtr; /** * 初始化队列 */ QueuePtr initQueue() { QueuePtr resultQueuePtr = (QueuePtr)malloc(sizeof(struct BTNodePtrQueue)); resultQueuePtr->nodePtrs = (BTNodePtr*)malloc(QUEUE_SIZE * sizeof(BTNodePtr)); resultQueuePtr->front = 0; resultQueuePtr->rear = 1; return resultQueuePtr; }//Of initQueue /** * 判断队列是否为空 */ bool isQueueEmpty(QueuePtr paraQueuePtr) { if ((paraQueuePtr->front + 1) % QUEUE_SIZE == paraQueuePtr->rear) { return true; }//Of if return false; }//Of isQueueEmpty /** * 向队列中添加一个指针 */ void enqueue(QueuePtr paraQueuePtr, BTNodePtr paraBTNodePtr) { printf("front = %d, rear = %d.\r\n", paraQueuePtr->front, paraQueuePtr->rear); if ((paraQueuePtr->rear + 1) % QUEUE_SIZE == paraQueuePtr->front % QUEUE_SIZE) { printf("错误,尝试入队 %c,队列已满。\r\n", paraBTNodePtr->element); return; }//Of if paraQueuePtr->nodePtrs[paraQueuePtr->rear] = paraBTNodePtr; paraQueuePtr->rear = (paraQueuePtr->rear + 1) % QUEUE_SIZE; printf("元素 %c 入队完成。\r\n", paraBTNodePtr->element); }//Of enqueue /** * 从队列中删除一个元素并返回 */ BTNodePtr dequeue(QueuePtr paraQueuePtr) { if (isQueueEmpty(paraQueuePtr)) { printf("错误,队列为空\r\n"); return NULL; }//Of if paraQueuePtr->front = (paraQueuePtr->front + 1) % QUEUE_SIZE; printf("元素 %c 出队完成。\r\n", paraQueuePtr->nodePtrs[paraQueuePtr->front]->element); return paraQueuePtr->nodePtrs[paraQueuePtr->front]; }//Of dequeue /** * 使用给定字符创建二叉树结点 */ BTNodePtr constructBTNode(char paraChar) { BTNodePtr resultPtr = (BTNodePtr)malloc(sizeof(BTNode)); resultPtr->element = paraChar; resultPtr->left = NULL; resultPtr->right = NULL; return resultPtr; }//Of constructBTNode /** * 使用给定字符串构造二叉树 */ BTNodePtr stringToBTree(char* paraString) { int i; char ch; //使用队列管理指针 QueuePtr tempQueuePtr = initQueue(); BTNodePtr resultHeader; BTNodePtr tempParent, tempLeftChild, tempRightChild; i = 0; ch = paraString[i]; resultHeader = constructBTNode(ch); enqueue(tempQueuePtr, resultHeader); while (!isQueueEmpty(tempQueuePtr)) { tempParent = dequeue(tempQueuePtr); //左孩子 i++; ch = paraString[i]; if (ch == '#') { tempParent->left = NULL; } else { tempLeftChild = constructBTNode(ch); enqueue(tempQueuePtr, tempLeftChild); tempParent->left = tempLeftChild; }//Of if //右孩子 i++; ch = paraString[i]; if (ch == '#') { tempParent->right = NULL; } else { tempRightChild = constructBTNode(ch); enqueue(tempQueuePtr, tempRightChild); tempParent->right = tempRightChild; }//Of if }//Of while return resultHeader; }//Of stringToBTree /** * 层序遍历 */ void levelwise(BTNodePtr paraTreePtr) { //使用队列管理指针 char tempString[100]; int i = 0; QueuePtr tempQueuePtr = initQueue(); BTNodePtr tempNodePtr; enqueue(tempQueuePtr, paraTreePtr); while (!isQueueEmpty(tempQueuePtr)) { tempNodePtr = dequeue(tempQueuePtr); //用于输出 tempString[i] = tempNodePtr->element; i++; if (tempNodePtr->left != NULL) { enqueue(tempQueuePtr, tempNodePtr->left); }//Of if if (tempNodePtr->right != NULL) { enqueue(tempQueuePtr, tempNodePtr->right); }//Of if }//Of while tempString[i] = '\0'; printf("层序遍历: %s\r\n", tempString); }//Of levelwise /** * 前序遍历 */ void preorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; }//Of if printf("%c", tempPtr->element); preorder(tempPtr->left); preorder(tempPtr->right); }//Of preorder /** * 中序遍历 */ void inorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; }//Of if inorder(tempPtr->left); printf("%c", tempPtr->element); inorder(tempPtr->right); }//Of inorder /** * 后序遍历 */ void postorder(BTNodePtr tempPtr) { if (tempPtr == NULL) { return; }//Of if postorder(tempPtr->left); postorder(tempPtr->right); printf("%c", tempPtr->element); }//Of postorder /** * 主函数 */ int main() { BTNodePtr tempHeader; tempHeader = constructBTNode('c'); printf("只有一个结点,前序遍历: "); preorder(tempHeader); printf("\r\n"); char* tempString = "acde#bf######"; tempHeader = stringToBTree(tempString); printf("前序遍历: "); preorder(tempHeader); printf("\r\n"); printf("中序遍历: "); inorder(tempHeader); printf("\r\n"); printf("后序遍历: "); postorder(tempHeader); printf("\r\n"); printf("层序遍历: "); levelwise(tempHeader); printf("\r\n"); return 1; }//Of main我的大二叉树
张小明
前端开发工程师
Icarus Verilog:为什么这个开源仿真器成为数字电路验证的首选?
Icarus Verilog:为什么这个开源仿真器成为数字电路验证的首选? 【免费下载链接】iverilog Icarus Verilog 项目地址: https://gitcode.com/gh_mirrors/iv/iverilog 在数字电路设计的广阔领域中,硬件描述语言(HDL࿰…
7.2.3 Structural Modifications Targeting Latency
你提供的两段文字拼接起来是书中关于 Virtual Channel Memory (VCDRAM) 的介绍。下面我先给出完整的英文原文,再提供中文翻译和解读。 一、拼接后的英文原文 The following DRAM offshoots represent attempts to lower the latency of the DRAM part, either by increasing t…
MLOps持续集成实战:应对ML项目CI的四大核心挑战与优化策略
1. 项目概述与核心挑战在传统软件开发领域,持续集成(CI)已经是一套相当成熟和标准化的工程实践。其核心逻辑清晰明了:开发者频繁地将代码变更提交到共享仓库,每次提交都会触发一个自动化的构建和测试流程。如果构建或测…
【Veo 2电影级创作终极指南】:20年影视技术专家亲授7大不可外传的帧率/光比/运镜黄金法则
更多请点击: https://codechina.net 第一章:Veo 2电影级创作的核心范式迁移 Veo 2 不再将视频生成视为“文本到帧”的静态映射,而是重构为以导演思维驱动的时序语义建模系统。其核心范式迁移体现在三个维度:从关键帧控制转向镜头…
如何优化网站排名:网站改版后流量腰斩的3天急救法
周一上午9点,全新UI排版上线第5天。打开谷歌分析后台,报表呈现实时自然搜索访客数从单日8500人陡降至320人。原占总成交额65%的搜索来源几乎清零。日均120个询盘表单如今只收到2封垃圾邮件。老域名积累了8年的页面权重面临清空危机。老板连发三封质问邮件…
基于ESP32与太阳能供电的物联网气象站全栈实现指南
1. 项目概述:一个自给自足的物联网气象站最近在折腾一个挺有意思的玩意儿:用ESP32/ESP8266这类物联网开发板,配合几个常见的传感器,搭建一个完全自给自足的微型气象站。这个项目的核心目标很明确:让它能独立、稳定地运…