GDPU 数据结构 天码行空10

2024-01-25 11:20

本文主要是介绍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;
}// 队列实现层序遍历(BFS)
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; // 移动到右子节点}}
}// 多叉树转二叉树
//root:多叉树的根节点
//broot:二叉树的根节点
void createBinaryTree(Node* root, BinaryNode* broot) {if (root == nullptr)//判空 return;broot->name = root->name; // 转换节点名称vector<Node*> nodes = root->nodes;//nodes存的是当前多叉树的子树if (nodes.empty()) {return;}// 左儿子右兄弟BinaryNode* left = new BinaryNode("", nullptr, nullptr);// 递归构建左子树createBinaryTree(nodes[0], left);BinaryNode* t = left;// t 是当前孩子中最右的孩子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>
#include <string.h>struct Node {char* name;                 // 结点名称struct Node** nodes;        // 子结点数组int num_nodes;              // 子结点数量
};struct BinaryNode {char* name;                 // 结点名称struct BinaryNode* left;    // 左子结点struct BinaryNode* right;   // 右子结点
};// 创建多叉树结点
struct Node* createNode(char* name, struct Node** nodes, int num_nodes) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));new_node->name = name;new_node->nodes = nodes;new_node->num_nodes = num_nodes;return new_node;
}// 创建二叉树结点
struct BinaryNode* createBinaryNode(char* name, struct BinaryNode* left, struct BinaryNode* right) {struct BinaryNode* new_node = (struct BinaryNode*)malloc(sizeof(struct BinaryNode));new_node->name = name;new_node->left = left;new_node->right = right;return new_node;
}// 多叉树的层序遍历
void levelOrder(struct Node* root) {struct Node** queue = (struct Node**)malloc(sizeof(struct Node*) * 1000);int front = 0;int rear = 0;queue[rear++] = root;printf("队列实现层序遍历:\n");while (front < rear) {struct Node* temp = queue[front++];printf("%s ", temp->name);for (int i = 0; i < temp->num_nodes; i++) {queue[rear++] = temp->nodes[i];}}printf("\n");
}// 二叉树的中序遍历
void inOrder(struct BinaryNode* root) {struct BinaryNode** stack = (struct BinaryNode**)malloc(sizeof(struct BinaryNode*) * 1000);int top = -1;struct BinaryNode* temp = root;printf("\n二叉树的中序遍历:\n");while (temp != NULL || top != -1) {if (temp != NULL) {stack[++top] = temp;temp = temp->left;}else {temp = stack[top--];printf("%s ", temp->name);temp = temp->right;}}
}// 创建二叉树
void createBinaryTree(struct Node* root, struct BinaryNode* broot) {broot->name = root->name;struct Node** nodes = root->nodes;int num_nodes = root->num_nodes;if (num_nodes == 0) {return;}struct BinaryNode* left = createBinaryNode("", NULL, NULL);createBinaryTree(nodes[0], left);struct BinaryNode* temp = left;for (int i = 1; i < num_nodes; i++) {struct Node* node = nodes[i];struct BinaryNode* right = createBinaryNode(node->name, NULL, NULL);createBinaryTree(nodes[i], right);temp->right = right;temp = right;}broot->left = left;
}// 多叉树的先序遍历
void preOrder(struct Node* root) {if (root == NULL) {return;}printf("%s ", root->name);for (int i = 0; i < root->num_nodes; i++) {preOrder(root->nodes[i]);}
}// 多叉树的后序遍历
void postOrder(struct Node* root) {if (root == NULL) {return;}for (int i = 0; i < root->num_nodes; i++) {postOrder(root->nodes[i]);}printf("%s ", root->name);
}int main() {// 创建多叉树结点struct Node* n31 = createNode("神经系统用药", NULL, 0);struct Node* n32 = createNode("消化系统用药", NULL, 0);struct Node* n33 = createNode("呼吸系统用药", NULL, 0);struct Node* n34 = createNode("心脑血管系统用药", NULL, 0);struct Node* n35 = createNode("抗感染药", NULL, 0);struct Node* n36 = createNode("其他用药", NULL, 0);struct Node* ns1[] = { n31, n32, n33, n34, n35, n36 };struct Node* n21 = createNode("中成药", NULL, 0);struct Node* n22 = createNode("化学药品", ns1, 6);struct Node* ns2[] = { n21, n22 };struct Node* n11 = createNode("双规制处方药", ns2, 2);struct Node* n12 = createNode("单规制处方药", NULL, 0);struct Node* nodes[] = { n11, n12 };struct Node* root = createNode("药品信息", nodes, 2);printf("多叉树的先序遍历:\n");preOrder(root);printf("\n多叉树的后序遍历:\n");postOrder(root);printf("\n");levelOrder(root);// 创建二叉树struct BinaryNode* broot = createBinaryNode("", NULL, NULL);createBinaryTree(root, broot);inOrder(broot);return 0;
}

四、实验结果

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

这篇关于GDPU 数据结构 天码行空10的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643098

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

【数据结构入门】排序算法之交换排序与归并排序

前言         在前一篇博客,我们学习了排序算法中的插入排序和选择排序,接下来我们将继续探索交换排序与归并排序,这两个排序都是重头戏,让我们接着往下看。  一、交换排序 1.1 冒泡排序 冒泡排序是一种简单的排序算法。 1.1.1 基本思想 它的基本思想是通过相邻元素的比较和交换,让较大的元素逐渐向右移动,从而将最大的元素移动到最右边。 动画演示: 1.1.2 具体步

数据结构:线性表的顺序存储

文章目录 🍊自我介绍🍊线性表的顺序存储介绍概述例子 🍊顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾” 和“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表,允许插入的一端叫做队尾(rear),允许删除的一端叫做队首(front)。 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的。基于数组的叫做顺序队列,基于列表的叫做链式队列。 一下是基于动态数组的顺序队列的模板类的实现。 顺序队列的抽象基类如下所示:只提供了接口和显式的默认构造函数和析构函数,在派生类中调用。 #i