首页 > 编程语言 >数据结构程序设计实验二

数据结构程序设计实验二

时间:2024-12-15 10:42:55浏览次数:5  
标签:遍历 TreeNode return 实验 str printf 程序设计 数据结构 root

  1 //二叉树的建立与遍历
  2 //[问题描述] 建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
  3 //[基本要求] 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立)
  4 //,并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。
  5 //[测试数据] ABCффDEфGффFффф(其中ф表示空格字符) 
  6 //则输出结果为 先序:ABCDEGF 中序:CBEGDFA 后序:CGEFDBA
  7 
  8 
  9 
 10 
 11 #include <stdio.h>
 12 #include <stdlib.h>
 13 
 14 // 定义二叉树的结点
 15 typedef struct TreeNode {
 16     char data;                 // 数据域,用于存储字符
 17     struct TreeNode* left;     // 左子树指针
 18     struct TreeNode* right;    // 右子树指针
 19 } TreeNode;
 20 
 21 // 创建一个新的树节点
 22 TreeNode* createNode(char data) {
 23     TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
 24     newNode->data = data;
 25     newNode->left = newNode->right = NULL;
 26     return newNode;
 27 }
 28 
 29 // 通过先序遍历字符串建立二叉树
 30 TreeNode* buildTree(const char** str) {
 31     // 如果当前字符是空格,则返回NULL,表示空树
 32     if (**str == ' ' || **str == '\0') {
 33         (*str)++;  // 向后移动指针
 34         return NULL;
 35     }
 36 
 37     // 创建当前节点
 38     TreeNode* root = createNode(**str);
 39     (*str)++;  // 向后移动指针
 40 
 41     // 递归建立左子树
 42     root->left = buildTree(str);
 43 
 44     // 递归建立右子树
 45     root->right = buildTree(str);
 46 
 47     return root;
 48 }
 49 
 50 // 先序遍历:根 -> 左 -> 右
 51 void preorderTraversal(TreeNode* root) {
 52     if (root == NULL) {
 53         return;
 54     }
 55     printf("%c", root->data); // 先访问根节点
 56     preorderTraversal(root->left); // 递归遍历左子树
 57     preorderTraversal(root->right); // 递归遍历右子树
 58 }
 59 
 60 // 中序遍历:左 -> 根 -> 右
 61 void inorderTraversal(TreeNode* root) {
 62     if (root == NULL) {
 63         return;
 64     }
 65     inorderTraversal(root->left); // 递归遍历左子树
 66     printf("%c", root->data); // 访问根节点
 67     inorderTraversal(root->right); // 递归遍历右子树
 68 }
 69 
 70 // 后序遍历:左 -> 右 -> 根
 71 void postorderTraversal(TreeNode* root) {
 72     if (root == NULL) {
 73         return;
 74     }
 75     postorderTraversal(root->left); // 递归遍历左子树
 76     postorderTraversal(root->right); // 递归遍历右子树
 77     printf("%c", root->data); // 访问根节点
 78 }
 79 
 80 // 释放二叉树的内存
 81 void freeTree(TreeNode* root) {
 82     if (root == NULL) {
 83         return;
 84     }
 85     freeTree(root->left);  // 释放左子树
 86     freeTree(root->right); // 释放右子树
 87     free(root);  // 释放当前节点
 88 }
 89 
 90 int main() {
 91     char input[100];
 92     printf("请输入先序遍历字符串('ф'代表空字符,结束符为'\\0'):");
 93     fgets(input, sizeof(input), stdin); // 读取输入
 94     const char* str = input;
 95 
 96     // 构建二叉树
 97     TreeNode* root = buildTree(&str);
 98 
 99     // 输出遍历结果
100     printf("先序遍历:");
101     preorderTraversal(root);
102     printf("\n");
103 
104     printf("中序遍历:");
105     inorderTraversal(root);
106     printf("\n");
107 
108     printf("后序遍历:");
109     postorderTraversal(root);
110     printf("\n");
111 
112     // 释放内存
113     freeTree(root);
114 
115     return 0;
116 }

 

标签:遍历,TreeNode,return,实验,str,printf,程序设计,数据结构,root
From: https://www.cnblogs.com/DREAMSRING/p/18607752

相关文章

  • 数据结构程序设计实验一
    1//设置一个栈,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入栈中;2//若是右括号,并且与当前栈顶的左括号相匹配,则将当前栈顶的左括号退出,继续读下一个括号,3//如果读入的右括号与当前栈顶的左括号不匹配,则属于不合法的情况。4//在初始和结束时,栈应该是空......
  • 机器学习:实验二:逻辑回归算法实现与测试
    实验二:逻辑回归算法实现与测试 一、实验目的深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作......
  • 2024-2025-1 20241311 《计算机基础与程序设计》第十二周学习总结
    学期2024-2025-1学号20241311《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十二周作业)这个作业的目标<写......
  • 数据结构:Win32 API详解
    目录一.Win32API的介绍二.控制台程序(Console)与COORD1..控制台程序(Console):2.控制台窗口坐标COORD:3.GetStdHandle函数:(1)语法:(2)参数:4.GetConsoleCursorInfo函数:(1)语法:(2)参数:(3)CONSOLE_CURSOR_INFO结构体:5.SetConsoleCursorInfo函数:实例:6.SetConsoleCursorPosition......
  • 2024-2025-1 20241427 《计算机基础与程序设计》第12周学习总结
    作业信息这个作业属于哪个课程[2024-2025-1-计算机基础与程序设计]这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标信息系统、数据库与SQL、人工智能与专家系统、人工神经网络、模拟与离散事件、排队系统、天气与地震模型......
  • 《计算机基础与程序设计》第十二周学习总结
    学期(如2024-2025-1)学号(如:20241300)《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程<班级的链接>2024-2025-1-计算机基础与程序设计这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十二周作业)这个作业的目标教材......
  • 数据结构——图论基础
    文章目录1.图的基本概念1.1图的定义1.2图的基本术语2.图的存储结构与基本运算算法2.1邻接矩阵2.2邻接表2.3十字链表3.图的遍历3.1深度优先遍历(DFS)3.2广度优先遍历(DFS)4.生成树与最小生成树4.1生成树的概念4.2非连通图与生成树5.最短路径5.1Dijkstra算法5.2Floyd-......
  • 2024-2025-1 20241403《计算机基础与程序设计》第十二周学习总结
    2024-2025-120241403《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标指针与一维,二维数......
  • 2024-2025-1 20241301 《计算机基础与程序设计》第十二周学习总结
    |这个作业属于哪个课程|2024-2025-1-计算机基础与程序设计||这个作业要求在哪里|2024-2025-1计算机基础与程序设计第一周作业||这个作业的目标|<复习知识,巩固基础>||作业正文|https://www.cnblogs.com/HonJo/p/18607135|一、教材学习内容(一)文件在C语言中,文件操作是程序设计......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标结构体和数据结构基础文件操作作业正文https://www.cnblogs.com/wchxx/p/18607077教材学习内容总......