《数据结构》实验报告

学号:2018329621200

机房号10-414

姓名: 申屠志刚

日期:2019/11/4

程序名:main.cpp

实验内容: 二叉树的遍历

一、目的和要求(需求分析):

1、掌握二叉树的存储结构以及二叉树的建立和操作。

2、输入一串表达式后,建立二叉树,并对其进行先序、中序和后序的遍历。

(输入表达式如此形式:a+b*c-d-e/f….;以#号结束。)

3、递归实现表达式运算。

二、程序设计的基本思想,原理和算法描述:

1、输入中缀表达式;

2、中缀表达式转化后缀表达式;

3、后缀表达式转化后缀表达式树;

4、递归实现表达式运算。

三、调试和运行程序过程中产生的问题及采取的措施:

1、中缀表达式建立表达式树比较繁琐;

措施:中缀表达式先转化后缀表达式;

2、判断存在括号的情况;

措施:利用栈;

3、多位数字的情况;

措施:atof函数。

四、源程序及注释:

Main.cpp

/*
*@Author:   STZG
*@Language: C++
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 100//树结点的设计
typedef struct node
{//数字和运算符union{char op;int data;};struct node *lchild;struct node *rchild;}TreeNode;//树栈的设计
typedef struct
{TreeNode *buf[MAX];int n;}TreeStack;//创建空栈
TreeStack *create_empty_stack()
{TreeStack *pstack;pstack = (TreeStack *)malloc(sizeof(TreeStack));pstack->n = -1;return pstack;
}//入栈
int push_stack(TreeStack *p,TreeNode *data)
{p->n ++;p->buf[p->n] = data;return 0;
}//出栈
TreeNode *pop_stack(TreeStack *p)
{TreeNode *data;data = p->buf[p->n];p->n --;return data;
}//判断空栈
int is_empty_stack(TreeStack *p)
{if(p->n == -1){return 1;}else{return 0;}
}//后缀表达式树的创建
TreeNode *create_express_tree(char *str,TreeStack *p)
{int i = 0;char dst[100];TreeNode *current;TreeNode *left,*right;int len=strlen(str);while(str[i]){if(str[i] == ' '){i ++;continue;}if(isdigit(str[i])){sscanf(str+i,"%s",dst);current = (TreeNode *)malloc(sizeof(TreeNode));current->data = atof(dst);current->lchild = current->rchild = NULL;push_stack(p,current);while (i+1 < len && isdigit(str[i+1])){++i;}}else{current = (TreeNode *)malloc(sizeof(TreeNode));current->op = str[i];right = pop_stack(p);left = pop_stack(p);current->lchild = left;current->rchild = right;push_stack(p,current);}/*printf("%s\n",str);if(current!=NULL)printf("%d or %c\n",current->data,current->data);*/i ++;}return p->buf[p->n];
}//打印结点
void print_node(TreeNode *p)
{if(p->lchild == NULL && p->rchild == NULL){printf("%d ",p->data);}else{printf("%c ",p->op);}return;
}//访问结点
int vist_node(TreeNode *p)
{print_node(p);return 0;
}//树的后序遍历
int PostOrder(TreeNode *p)
{if(p != NULL){PostOrder(p->lchild);//左PostOrder(p->rchild);//右vist_node(p);//根}return 0;
}//树的中序遍历
int InOrder(TreeNode *p)
{if(p != NULL){InOrder(p->lchild);//左vist_node(p);//根InOrder(p->rchild);//右}return 0;
}//树的前序遍历
int PreOrder(TreeNode *p)
{if(p != NULL){vist_node(p);//根PreOrder(p->lchild);//左PreOrder(p->rchild);//右}return 0;
}char stack[500];                   //定义顺序栈,其中top==0表示栈为空;
int top;                            //栈顶指针,为0表示栈为空;
char output[500], input[500];       //波兰式
int outLen;int priority(char op)                //判断运算符级别函数;其中* /的级别为2,+ -的级别为1;
{if (op=='+' || op=='-')return 1;if (op=='*' || op=='/')return 2;elsereturn 0;
}bool isOperator(char op)               //判断输入串中的字符是不是操作符,如果是返回true
{return (op=='+' || op=='-' || op=='*' || op=='/');
}void rePolish(char *s,int len)         //将一个中缀串转换为后缀串,
{memset(output,'\0',sizeof output);   //输出串outLen = 0;for (int i=0; i < len; ++i)          //1)求输入串的逆序。{if (isdigit(s[i]))              //经验见:http://blog.csdn.net/linraise/article/details/18566319#comments{output[outLen++] = s[i];       //3)假如是操作数,把它添加到输出串中。while (i+1 < len && isdigit(s[i+1])){output[outLen++] = s[i+1];++i;}output[outLen++] = ' ';      //空格隔开}if (s[i]=='(')                   //4)假如是闭括号,将它压栈。{++top;stack[top] = s[i];}while (isOperator(s[i]))     //5)如果是运算符,执行算法对应操作;{if (top==0 || stack[top]=='(' || priority(s[i]) > priority(stack[top])) //空栈||或者栈顶为)||新来的元素优先级更高{++top;stack[top] = s[i];break;}else{output[outLen++] = stack[top];output[outLen++] = ' ';--top;}}if (s[i]==')')                 //6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。{while (stack[top]!='('){output[outLen++] = stack[top];output[outLen++] = ' ';--top;}--top;    // 此时stack[top]==')',跳过)}//7)假如输入还未完毕,跳转到步骤2。}while (top!=0)                     //8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。{output[outLen++] = stack[top];output[outLen++] = ' ';--top;}
}double OP(double op1,double op2,char op)
{double res = 0;if (op=='+')res = op1 + op2;else if (op=='-')res = op1 - op2;else if (op=='*')res = op1 * op2;else if (op=='/')res = op1 / op2;return res;
}double cSt1[200];
//波兰式的计算
double CalOrder(char *s)                //波兰式需要用两个栈,逆波兰式只需要一个栈
{char dst[80];int top1=0, i;for (i=0; s[i]; ++i){if (s[i] && s[i] != ' '){sscanf(s+i,"%s",dst);if (isdigit(dst[0])){++top1;cSt1[top1] = atof(dst);     //进栈}else{cSt1[top1-1] = OP(cSt1[top1-1], cSt1[top1], dst[0]);//   memcpy(cSt1[top1-1],DstBuf,sizeof DstBuf);--top1;                       //操作数栈:出栈俩,进栈一}while (s[i] && s[i] != ' ')++i;}}return cSt1[1];
}
//树的计算
double CalOrder(TreeNode *p)
{if(p->lchild != NULL&&p->rchild != NULL){return OP(CalOrder(p->lchild) ,CalOrder(p->rchild), p->op);}return p->data;
}int main()
{TreeNode *thead;TreeStack *pstack;int i = 0;while((input[i++] = getchar()) != '\n' && i < 100);input[i-1] = 0;printf("%s\n",input);rePolish(input, strlen(input));output[outLen-1] = '\0';pstack = create_empty_stack();thead = create_express_tree(output,pstack);printf("PostOrder:: ");PostOrder(thead);printf("\n");printf("InOrder:: ");InOrder(thead);printf("\n");printf("PreOrder:: ");PreOrder(thead);printf("\n");printf("CalOrder::");printf("%f",CalOrder(output));printf("\n");printf("CalOrder::");printf("%f",CalOrder(thead));printf("\n");return 0;
}

五、运行输出结果:

六、心得与体会:

1、掌握二叉树的存储结构以及二叉树的建立和操作。

2、输入一串表达式后,建立二叉树,并对其进行先序、中序和后序的遍历。

3、递归实现表达式运算。

4、理论上来讲, 一个中缀表达式是不能够转换出一个唯一的二叉树的,但是中缀算术表达式因为有运算符的优先级关系, 建立二叉树时, 需要所有的操作数都在叶子节点上, 所有的操作符都在父(根)节点上, 这个特征可以生成一个唯一的二叉树。

5、atof函数的运用。

《数据结构与算法》实验报告——二叉树的遍历相关推荐

  1. 【数据结构与算法基础】二叉树与其遍历序列的互化 附代码实现(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  2. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  3. 数据结构排序算法实验报告_数据结构与算法-堆排序

    堆排序 堆排序是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点,堆排序的时间复杂度为O(nlogn).( ...

  4. 数据结构与算法实验报告——实验一 链表

    实验一 链表 实验目的和要求 1.理解线性表的链式存储结构. 2.熟练掌握动态链表结构及有关算法的设计. 根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关 算法. 实验任务 1. 对任意 ...

  5. 数据结构与算法 实验报告一 约瑟夫环(单循环链表)

    实验内容: 约瑟夫环求解. 编号为1,2,....,N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数上限值M,从第一个人开始按顺时针方向自1开始顺序报数,报到M ...

  6. 【数据结构与算法实验】二叉树与哈夫曼图片压缩

    使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩.图片文件名为"Pic.bmp",压缩后保存为"Pic.bmp.huf"文件. 程序截图: Mai ...

  7. 计算机学院算法实验报告,四川大学计算机学院数据结构与算法分析实验报告

    四川大学计算机学院数据结构与算法分析实验报告 (61页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 21.9 积分 <数据结构与算法>课程设计 ...

  8. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc

    数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...

  9. 数据结构与算法--死磕二叉树

    死磕二叉树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树 ...

最新文章

  1. 为什么 MySQL 的自增主键不单调也不连续
  2. 2020年人工神经网络第二次作业-参考答案第一题
  3. Android之自定义View以及画一个时钟
  4. 天天象棋 残局闯关 第3关
  5. 决策树原理实例(python代码实现)_决策树原理实例(python代码实现)
  6. cisco 华三 对接_Cisco ACS 5.6与华为,H3C设备对接操作指引
  7. 一个女人如何让自已越来越厉害
  8. ASA REST API安装步骤
  9. Blender插件初始化范例
  10. CSDN企业账户用户手册操作文档
  11. Protobuf编码规则详解
  12. 计算机机房kvm系统配件,KVM设备在机房管理改造中的解决方案
  13. css手册.chm + W3CSchool.chm下载
  14. 天宝数字水准数据处理和生成
  15. Android图形shape的gradient渐变色背景
  16. html中鼠标悬停图片变大,JavaScript通过mouseover()实现图片变大效果的示例
  17. html 实现excel表格分页打印,excel分页-用了这么多年Excel才知道,按下这个键,一张纸便可打印全部内容...
  18. 关于举办“COMSOL Multiphysics多物理场仿真技术与应用”光电专题线上培训班的通知
  19. 2021年安全员-A证(广西省-2021版)考试及安全员-A证(广西省-2021版)考试试卷
  20. python dict是什么意思,python中的字典是什么

热门文章

  1. 计算机组成原理实验箱使能开关,计算机组成原理微程序计数器实验报告
  2. python怎么做q检验_统计学_Cochran’s Q Test(python代码实现)
  3. mac怎么实现文件读写c语言,使用Sublime Text和Xcode在Mac上进行文件输入/输出。 C语言...
  4. python画圆形螺旋线_PS画结构素描与示范-金属管道台灯(电脑绘画)
  5. macbook服务器文件,使用MacBook生成服务器使用的p12证书文件
  6. 七、Sqoop架构,安装和基本使用
  7. 六十二、数据结构栈和队列的相互实现
  8. 十、给小白看的第三篇Python基础教程
  9. 三十一、R语言基本语法(上篇)
  10. 京东AI NLP高阶实训学习笔记