GDPU 数据结构 天码行空10

目录

  • 数据结构实验十 树遍历应用
    • 一、【实验目的】
    • 二、【实验内容】
    • 三、【实验源代码】
      • ⭐ CPP版
      • ⭐ c语言版
    • 四、实验结果

数据结构实验十 树遍历应用

一、【实验目的】

1、了解树的建立方法
2、掌握树与二叉树的转化及其遍历的基本方法
3、掌握递归二叉树遍历算法的应用

二、【实验内容】

1.构造一棵药品信息树,树的形态如下图所示,打印出先序遍历、后序遍历的遍历序列。
2.编写一个层序遍历算法,利用队列结构按层次(同一层自左至右)输出树中所有的结点。
3.将树结构转化为二叉树,编写二叉树非递归中序遍历算法,并输出遍历序列。

三、【实验源代码】

⭐ CPP版

#include <iostream>
#include <queue>
#include <stack>using namespace std;// 多叉树节点
struct Node {string name; // 节点名称vector<Node*> nodes; // 子节点指针数组Node(string name, vector<Node*> nodes) : name(name), nodes(nodes) {}
};// 二叉树节点
struct BinaryNode {string name; // 节点名称BinaryNode *left; // 左子节点指针BinaryNode *right; // 右子节点指针BinaryNode(string name, BinaryNode *left, BinaryNode *right) : name(name), left(left), right(right) {}
};// 按照题意初始化多叉树
Node* init() {// 第四层Node* n31 = new Node("神经系统用药", {});Node* n32 = new Node("消化系统用药", {});Node* n33 = new Node("呼吸系统用药", {});Node* n34 = new Node("心脑血管系统用药", {});Node* n35 = new Node("抗感染药", {});Node* n36 = new Node("其他用药", {});// 第三层vector<Node*> ns1 = {n31, n32, n33, n34, n35, n36};Node* n21 = new Node("中成药", {});Node* n22 = new Node("化学药品", ns1);// 第二层vector<Node*> ns2 = {n21, n22};Node* n11 = new Node("双规制处方药", ns2);Node* n12 = new Node("单规制处方药", {});// 第一层Node* root = new Node("药品信息", {n11, n12}); // 根节点return root;
}// 队列实现层序遍历
void LevelOrderByQueue(Node* root) {queue<Node*> q;q.push(root);cout << "队列实现层序遍历:" << endl;while (!q.empty()) {Node* t = q.front(); // 取出队首节点q.pop(); // 队首节点出队cout << t->name << " "; // 输出节点名称for (Node* node : t->nodes) {q.push(node); // 将子节点加入队列}}
}// 二叉树的非递归遍历(栈)
void InOrder(BinaryNode* root) {stack<BinaryNode*> s;BinaryNode* t = root;cout << endl;cout << "二叉树的中序遍历:" << endl;while (t != nullptr || !s.empty()) {if (t != nullptr) {s.push(t);t = t->left; // 移动到左子节点} else {t = s.top(); // 弹出栈顶节点s.pop();cout << t->name << " "; // 输出节点名称t = t->right; // 移动到右子节点}}
}// 多叉树转二叉树
void createBinaryTree(Node* root, BinaryNode* broot) {if (root == nullptr) {return;}broot->name = root->name; // 转换节点名称vector<Node*> nodes = root->nodes;if (nodes.empty()) {return;}// 左儿子右兄弟BinaryNode* left = new BinaryNode("", nullptr, nullptr);createBinaryTree(nodes[0], left); // 递归构建左子树BinaryNode* t = left;for (int i = 1; i < nodes.size(); i++) {Node* node = nodes[i];BinaryNode* right = new BinaryNode(node->name, nullptr, nullptr); // 构建右子树createBinaryTree(nodes[i], right); // 递归构建右子树t->right = right; // 连接右兄弟节点t = right;}broot->left = left; // 连接左子树
}// 多叉树的先序遍历
void preOrder(Node* root) {if (root == nullptr) {return;}cout << root->name << " "; // 输出节点名称for (Node* n : root->nodes) {preOrder(n); // 递归遍历子节点}
}// 多叉树的后序遍历
void postOrder(Node* root) {if (root == nullptr) {return;}for (Node* n : root->nodes) {postOrder(n); // 递归遍历子节点}cout << root->name << " "; // 输出节点名称
}int main() {Node* root = init();// 打印先后序遍历cout << "多叉树的先序遍历:" << endl;preOrder(root); // 先序遍历cout << "\n多叉树的后序遍历:" << endl;postOrder(root); // 后序遍历cout << endl;LevelOrderByQueue(root); // 层序遍历BinaryNode* broot = new BinaryNode("", nullptr, nullptr);createBinaryTree(root, broot); // 多叉树转二叉树InOrder(broot); // 中序遍历二叉树return 0;
}

⭐ c语言版

#include <stdio.h>
#include <stdlib.h>// 多叉树节点
typedef struct Node
{char* name;struct Node** nodes;int numOfNodes;
} Node;// 二叉树节点
typedef struct BinaryNode
{char* name;struct BinaryNode* left;struct BinaryNode* right;
} BinaryNode;// 按照题意初始化多叉树
Node* init()
{// 第四层Node* n31 = (Node*)malloc(sizeof(Node));n31->name = "神经系统用药";n31->nodes = NULL;n31->numOfNodes = 0;Node* n32 = (Node*)malloc(sizeof(Node));n32->name = "消化系统用药";n32->nodes = NULL;n32->numOfNodes = 0;Node* n33 = (Node*)malloc(sizeof(Node));n33->name = "呼吸系统用药";n33->nodes = NULL;n33->numOfNodes = 0;Node* n34 = (Node*)malloc(sizeof(Node));n34->name = "心脑血管系统用药";n34->nodes = NULL;n34->numOfNodes = 0;Node* n35 = (Node*)malloc(sizeof(Node));n35->name = "抗感染药";n35->nodes = NULL;n35->numOfNodes = 0;Node* n36 = (Node*)malloc(sizeof(Node));n36->name = "其他用药";n36->nodes = NULL;n36->numOfNodes = 0;// 第三层Node** ns1 = (Node**)malloc(6 * sizeof(Node*));ns1[0] = n31;ns1[1] = n32;ns1[2] = n33;ns1[3] = n34;ns1[4] = n35;ns1[5] = n36;Node* n21 = (Node*)malloc(sizeof(Node));n21->name = "中成药";n21->nodes = NULL;n21->numOfNodes = 0;Node* n22 = (Node*)malloc(sizeof(Node));n22->name = "化学药品";n22->nodes = ns1;n22->numOfNodes = 6;// 第二层Node** ns2 = (Node**)malloc(2 * sizeof(Node*));ns2[0] = n21;ns2[1] = n22;Node* n11 = (Node*)malloc(sizeof(Node));n11->name = "双规制处方药";n11->nodes = ns2;n11->numOfNodes = 2;Node* n12 = (Node*)malloc(sizeof(Node));n12->name = "单规制处方药";n12->nodes = NULL;n12->numOfNodes = 0;// 第一层Node* root = (Node*)malloc(sizeof(Node));root->name = "药品信息";root->nodes = (Node**)malloc(2 * sizeof(Node*));root->nodes[0] = n11;root->nodes[1] = n12;root->numOfNodes = 2;return root;
}// 队列实现层序遍历
void LevelOrderByQueue(Node* root)
{Node** queue = (Node**)malloc(1000 * sizeof(Node*));int front = 0;int rear = 0;queue[rear++] = root;printf("队列实现层序遍历:\n");while (front < rear){Node* t = queue[front++];printf("%s ", t->name);if (t->nodes != NULL){for (int i = 0; i < t->numOfNodes; i++){queue[rear++] = t->nodes[i];}}}free(queue);
}// 二叉树的中序遍历(栈)
void InOrder(BinaryNode* root)
{BinaryNode** stack = (BinaryNode**)malloc(1000 * sizeof(BinaryNode*));int top = -1;BinaryNode* t = root;printf("\n二叉树的中序遍历:\n");// 中序:先输出左子树,再输出根,只要左子树非空,就一直把左子树入栈while (t != NULL || top != -1){if (t != NULL){stack[++top] = t;t = t->left;}else{t = stack[top--]; // 说明当前栈顶元素的左子树为空,可以输出栈顶元素printf("%s ", t->name);t = t->right; // 根输出后,接着继续遍历右子树}}free(stack);
}// 多叉树转二叉树
BinaryNode* createBinaryTree(Node* root, BinaryNode* broot)
{if (root == NULL)return NULL;broot->name = root->name;Node** nodes = root->nodes;if (nodes == NULL)return NULL;// 左儿子右兄弟BinaryNode* left = (BinaryNode*)malloc(sizeof(BinaryNode));createBinaryTree(nodes[0], left);BinaryNode* t = left;for (int i = 1; i < root->numOfNodes; i++){Node* node = nodes[i];BinaryNode* right = (BinaryNode*)malloc(sizeof(BinaryNode));createBinaryTree(nodes[i], right);t->right = right;t = right;}broot->left = left;return broot;
}// 多叉树的先序遍历
void preOrder(Node* root)
{if (root == NULL)return;printf("%s ", root->name);Node** nodes = root->nodes;if (nodes == NULL)return;for (int i = 0; i < root->numOfNodes; i++){preOrder(nodes[i]);}
}// 多叉树的后序遍历
void postOrder(Node* root)
{if (root == NULL)return;Node** nodes = root->nodes;if (nodes == NULL){printf("%s ", root->name);return;}for (int i = 0; i < root->numOfNodes; i++){postOrder(nodes[i]);}printf("%s ", root->name);
}int main()
{Node* root = init();// 打印先后序遍历printf("多叉树的先序遍历:\n");preOrder(root);printf("\n多叉树的后序遍历:\n");postOrder(root);printf("\n");LevelOrderByQueue(root);BinaryNode* broot = (BinaryNode*)malloc(sizeof(BinaryNode));createBinaryTree(root, broot);InOrder(broot);return 0;
}

四、实验结果

多叉树的先序遍历:
药品信息 双规制处方药 中成药 化学药品 神经系统用药 消化系统用药 呼吸系统用药 心脑血管系统用药 抗感染药 其他用药 单规制处方药 
多叉树的后序遍历:
中成药 神经系统用药 消化系统用药 呼吸系统用药 心脑血管系统用药 抗感染药 其他用药 化学药品 双规制处方药 单规制处方药 药品信息 
队列实现层序遍历:
药品信息 双规制处方药 单规制处方药 中成药 化学药品 神经系统用药 消化系统用药 呼吸系统用药 心脑血管系统用药 抗感染药 其他用药 
二叉树的层序遍历:
中成药 神经系统用药 消化系统用药 呼吸系统用药 心脑血管系统用药 抗感染药 其他用药 化学药品 双规制处方药 单规制处方药 药品信息 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UiPath Studio 2023.10 Crack

UiPath Studio是一款功能强大且用户友好的集成开发环境 (IDE)&#xff0c;专为机器人流程自动化 (RPA) 设计。它由自动化技术领域的领先公司UiPath开发。 以下是 UiPath Studio 的一些主要功能和组件&#xff1a; 图形用户界面 (GUI)&#xff1a;UiPath Studio 具有直观且用户友…

【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)

1. 概念理解 逻辑回归&#xff0c;简称LR&#xff0c;它的特点是能够将我们的特征输入集合转化为0和1这两类的概率。一般来说&#xff0c;回归不用在分类问题上&#xff0c;但逻辑回归却能在二分类(即分成两类问题)上表现很好。 逻辑回归本质上是线性回归&#xff0c;只是在特…

2311rust,1.31版本更新

1.31.0稳定版 Rust1.31可能是最激动人心的版本! 使用Cargo创建一个新项目: cargo new foo以下是Cargo.toml的内容: [package] name "foo" version "0.1.0" authors ["名字"] edition "2018" //版本. [dependencies]在[package]…

数据采集与大数据架构分享

实现场景 要实现亿级数据的长期收集更新&#xff0c;并对采集后的数据进行整理和加工&#xff0c;用于人工智能的训练数据素材集。 数据采集 java支持的爬虫框架还是有很多的&#xff0c;如&#xff1a;webMagic、Spider、Jsoup等添加链接描述 pipeline处理管道 数据并发开发…

2023年【危险化学品经营单位安全管理人员】考试题及危险化学品经营单位安全管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试题是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员模拟试题&#xff0c;安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习。…

操作系统(五)| 文件系统上 结构 存取方式 文件目录 检索

文章目录 1 文件系统概述2 文件的结构与存取方式2.1 磁盘2.2 文件的物理结构2.2.1 连续结构2.2.2 链式结构2.2.3 索引结构 2.3 文件的存取方式 3 文件目录3.1 基本概念3.2 目录结构单级目录结构多级目录结构 3.3 文件目录检索3.3.1 目录检索文件寻址 3.4 文件目录的实现 1 文件…

4、FFmpeg命令行操作9

FFmpeg命令提取音视频数据 保留封装格式 ffmpeg -i test.mp4 -acodec copy -vn audio.mp4 ffmpeg -i test.mp4 -vcodec copy -an video.mp4 提取视频 保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264 强制格式:ffmpeg -i…

从0开始学习JavaScript--JavaScript 字符串与文本内容使用

JavaScript中的字符串和文本内容处理是前端开发中的核心技能之一。本文将深入研究字符串的创建、操作&#xff0c;以及文本内容的获取、修改等操作&#xff0c;并通过丰富的示例代码&#xff0c;帮助读者更全面地了解和应用这些概念。 JavaScript 字符串基础 字符串是JavaScr…

Spark算子 - Python

第1关&#xff1a;Transformation - map # -*- coding: UTF-8 -*- from pyspark import SparkContextif __name__ "__main__":#********** Begin **********## 1.初始化 SparkContext&#xff0c;该对象是 Spark 程序的入口sc SparkContext("local",&qu…

c++23中的新功能之十九继承的CTAD

一、继承 在c编程中&#xff0c;一定是脱离不开继承的。而继承中有很多小的细节需要关注&#xff0c;比如如何显示的使用父类的构造函数&#xff1f;如何通过构造函数来推导模板参数等等。这些小的细节&#xff0c;其实都是在实际应用中对一些相关技术的不断完善。 二、继承的…

微服务实战系列之Nacos

导语 欢迎来到 “Nacos” 的世界&#xff01; Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单…

Ubuntu环境下以编译源码的方式安装Vim

目录 1. Ubuntu环境 2. 下载编译vim 2.1 效果截图 3. 配置环境变量 1. Ubuntu环境 Linux chris-166 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux 2. 下载编译vim // 源码下载 chris_166chris-16…

文件传输客户端 SecureFX mac中文版支持多种协议

SecureFX mac是一款功能强大的文件传输客户端&#xff0c;可在 Mac 操作系统上使用。它由 VanDyke Software 公司开发&#xff0c;旨在为用户提供安全、可靠、高效的文件传输服务。 SecureFX 支持多种协议&#xff0c;包括 SFTP、SCP、FTP、FTP over SSL/TLS 和 HTTP/S。它使用…

联想系列台式机Win11系统改Win7系统BIOS设置步骤

联想最新一代的台式机默认操作系统Win11&#xff0c;采用UEFIGPT启动模式&#xff0c;并且开启了安全启动功能&#xff0c;一般用户不能直接将Win11改成Win7&#xff0c;如果需要更改操作系统&#xff0c;是需要再BIOS菜单中关闭安全启动功能的&#xff0c;并且把启动模式设置成…

2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序

2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放&#xff0c;国家的综合实力不断增强&#xff0c;中国高等教育发展整体已进入世界中上水平。作为一个教育大省&#xff0c;江苏省的本科教育发展在全国名列前茅&#xff0c;而江苏省13个地级…

Django测试环境搭建及ORM查询(创建外键|跨表查询|双下划线查询 )

文章目录 一、表查询数据准备及测试环境搭建模型层前期准备测试环境搭建代码演示 二、ORM操作相关方法三、ORM常见的查询关键字四、ORM底层SQL语句五、双下划线查询数据查询&#xff08;双下划线&#xff09;双下划线小训练Django ORM __双下划线细解 六、ORM外键字段创建基础表…

Linux常用命令——bye命令

在线Linux命令查询工具 bye 命令用于中断FTP连线并结束程序。。 补充说明 bye命令在ftp模式下&#xff0c;输入bye即可中断目前的连线作业&#xff0c;并结束ftp的执行。 语法 bye实例 bye在线Linux命令查询工具

蓝眼开源云盘部署全过程(手动安装)

环境概述&#xff1a; 系统-Centos7.4 数据库-MySQL8 云盘系统-Tank4.0.1 前提&#xff1a;操作系统已完成安装&#xff0c;有外部网络。 一.安装数据库 cd到合适的目录进行下载安装操作&#xff0c;期间不要切换出去。 wget https://dev.mysql.com/get/mysql80-community-r…

Linux使用ifconifg命令,没有显示ens33

Linux使用ifconifg命令&#xff0c;没有显示ens33 1.问题2.步骤2.1 查看虚拟机的组件是否启动了2.2 修改网络配置文件 ONBOOT修改为yes2.3 重启网络2.4 修改网络服务配置 3.解决 1.问题 打开虚拟机准备使用xshell连接时发现连接失败&#xff0c;在机器上查看ip发现ens33不现实…

C++项目案例圆和点的关系 (涉及知识点:头文件定义类,cpp文件实现类,类和作用域,linux编译运行c++项目)

一.项目描述 点与圆有三种关系&#xff1a; 点在圆外 点在圆上 点在圆内计算点到圆心的距离就能判断点在圆的哪个地方。二.项目结构 三.include文件 3.1 Circle类的声明 Circle.h // 防止头文件重复包含 #pragma once // #include<iostream> #include "Point.h&…