news 2026/5/25 19:15:45

我的大二叉树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
我的大二叉树
#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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 19:12:17

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…

作者头像 李华
网站建设 2026/5/25 19:09:42

MLOps持续集成实战:应对ML项目CI的四大核心挑战与优化策略

1. 项目概述与核心挑战在传统软件开发领域&#xff0c;持续集成&#xff08;CI&#xff09;已经是一套相当成熟和标准化的工程实践。其核心逻辑清晰明了&#xff1a;开发者频繁地将代码变更提交到共享仓库&#xff0c;每次提交都会触发一个自动化的构建和测试流程。如果构建或测…

作者头像 李华
网站建设 2026/5/25 19:00:59

如何优化网站排名:网站改版后流量腰斩的3天急救法

周一上午9点&#xff0c;全新UI排版上线第5天。打开谷歌分析后台&#xff0c;报表呈现实时自然搜索访客数从单日8500人陡降至320人。原占总成交额65%的搜索来源几乎清零。日均120个询盘表单如今只收到2封垃圾邮件。老域名积累了8年的页面权重面临清空危机。老板连发三封质问邮件…

作者头像 李华
网站建设 2026/5/25 18:56:01

基于ESP32与太阳能供电的物联网气象站全栈实现指南

1. 项目概述&#xff1a;一个自给自足的物联网气象站最近在折腾一个挺有意思的玩意儿&#xff1a;用ESP32/ESP8266这类物联网开发板&#xff0c;配合几个常见的传感器&#xff0c;搭建一个完全自给自足的微型气象站。这个项目的核心目标很明确&#xff1a;让它能独立、稳定地运…

作者头像 李华