表达式二叉树上机报告

合集下载

软基上机实验报告-二叉树(拓展题)

软基上机实验报告-二叉树(拓展题)

•ex4_2——扩展题1)实现二叉排序树的插入函数2)main函数中,输入一组无序数,调用二叉排序树插入算法,将元素放入二叉树中3)中序遍历这颗二叉树,得到排序顺序。

ex4-3——扩展题1)编写函数求一颗二叉树的深度2)求一颗二叉排序树的排序的反序结果,即将二叉排序树每个节点的左右子树交换,然后中序遍历之。

一、程序流程说明1.二叉树的插入算法(4-2):在基本题中我已说明了二叉排序树的创建过程,基本原理就是先建立一个节点,然后通过数值大小的比较将节点拼接到这颗树上,故插入算法仅仅是将二叉排序树创建过程中的一个节点插入的部分取出来即可。

2.求二叉树的深度及反序(4-3):求二叉树的深度:可以采用递归去做,首先从根节点开始,访问左子树,访问右子树,然后以相应的左右子树为根节点继续向下访问。

每一次的向下访问将深度加一,然后返回左右子树中值较大的那一个。

反序二叉树:仍然用递归去做,首先从根节点开始,将左右子树交换,然后以根节点的左右子树为根节点继续交换。

二、程序代码二叉树的插入算法:void enter(bnode **t,int x){bnode *p,*q;p=(bnode *)malloc(sizeof(bnode));p->lchild=NULL;p->rchild=NULL;p->data=x;if(*t==NULL){*t=p;}else{q=*t;while(q!=NULL){if(p->data<q->data){if(q->lchild!=NULL){q=q->lchild;}else{q->lchild=p;q=NULL;break;}}else{if(q->rchild!=NULL){q=q->rchild;}else{q->rchild=p;p=NULL;break;}}。

}}}求二叉树的深度以及反序:int deep(bnode *p){if(p==NULL)return 0;int i=1;int j=1;i=deep(p->lchild);j=deep(p->rchild);return (i>j?i:j)+1;}void opposite(bnode *p){if(p==NULL)return;bnode *h;h=p->lchild;p->lchild=p->rchild;p->rchild=h;if(p->lchild!=NULL)opposite(p->lchild);if(p->rchild!=NULL)opposite(p->rchild);}三、测试数据4-2二叉树的插入算法:输入:Please input your tree0 to end:190 381 12 40 410 394 540 760 85 476 800 146 9 445 0inorder is(before):9 12 40 85 146 190 381 394 410 445 476 540 760 800 please input the numbers you want to input(use 0 to end): 600输出:inorder is(after):9 12 40 85 146 190 381 394 410 445 476 540 600 760 800 4-3二叉树的深度及反序输入:Please input your tree0 to end:190 381 12 40 410 394 540 760 85 476 800 146 9 445 600 0输出:inorder is:9 12 40 85 146 190 381 394 410 445 476 540 600 760 800the deepth is: 6after opposite the inorder is:800 760 600 540 476 445 410 394 381 190 146 85 40 12 9四、上机时遇到的问题1.问题现象:插入元素时运行直接崩溃原因:至今为止未找到原因解决办法:突然想到可以用建立过程去解决,就截取了一部分建立函数过来2.问题现象:求深度时当传入一个空二叉树时,运行崩溃原因:没有对空二叉树这种情况进行特殊的处理解决方法:进行判断,当为空二叉树时返回0实际运行结果4-2二叉树的插入算法:求二叉树的深度及反序:五、小结与体会1.这次实验让我对二叉树的创建过程有了一个全新的认识,也让我明白了其实树的创建过程无非就是一群插入过程的集合。

北工大数据结构上机实验报告3教材

北工大数据结构上机实验报告3教材

上机题三报告姓名:学号:完成日期:2015年5月5日题目:表达式可以用表达式二义树来表示。

对于简单的四则运算表达式,请实现以下功能;(1)对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二义树,并且以图示显示出来(字符图或图形的形式)。

(2)对于构造好的内部表达式二叉树,按照用户要求,输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号).一、需求分析1.输入形式、输入值的范围;输入前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号)2.输出形式^表达式二叉树,前缀表达式、中缀表达式和后缀表达式。

3・程序功能;用表达式二叉树表示表达式,并转换为前缀表达式、中缀表达式或后缀表达式。

4.测试数据正确的输入输出:错误的输入输出:二、概要设计1. ADT定义class TNode//W 点类3.各程序模块间的调用关系2.主程序流程Main ()求二叉树表达式模块求前、中、后缀表达式模块打印树删除树三、详细设计1.实现ADT定义的数据类型class TNode//节点类{ public:char oper;//数据域,为简便起见,操作数用单个字符代替TNode *left;TNode *right;int s;int t;〃计算树的层数使用TNode()//缺省构造函数{ left 二right二NULL;opei-O;}TNode(char op)//赋值构造函数{ left 二right 二NULL;opei-op;}1;2.算法描述表达式转化为二叉树void pre2tree(TNode *&p, string str)//#缀表达式生成二叉树{ 碰到操作数则把英值赋给相应的新申请的二叉树结点,地址压栈:碰到操作符则把其值赋给相应的新申请的二叉树,并从栈中弹出两个地址,分别作为英左指针和右指针,然后再把其地址压栈,最后一个地址即为二叉树的根结点地址。

二叉树基本操作--实验报告

二叉树基本操作--实验报告

//二叉树的结点个数 int NodesCount(BTNode *b){
if(b==NULL) return 0;
else return NodesCount(b->lchild)+NodesCount(b->rchild)+1;
}
//先序遍历递归 void PreOrder(BTNode *b){
switch(ch){ case '(':top++;St[top]=p;k=1;break; case ')':top--;break; case ',':k=2;break; default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL; if(b==NULL)
BTNode *p; BTNode *qu[MaxSize]; int front,rear; front=rear=-1; rear++; qu[rear]=b; while(front!=rear){
front=(front+1)%MaxSize; p=qu[front]; printf("%c",p->data); if(p->lchild!=NULL){
rear=(rear+1)%MaxSize; qu[rear]=p->lchild; } if(p->rchild!=NULL){ rear=(rear+1)%MaxSize; qu[rear]=p->rchild; } } }
void main()

实验报告:二叉树

实验报告:二叉树

实验报告:二叉树第一篇:实验报告:二叉树实验报告二叉树一实验目的1、进一步掌握指针变量,动态变量的含义;2、掌握二叉树的结构特性以及各种存储结构的特点及适用范围。

3、掌握用指针类型描述、访问和处理二叉树的运算。

4、熟悉各种存储结构的特征以及如何应用树结构解决具体问题。

二实验原理树形结构是一种应用十分广泛和重要的非线性数据结构,是一种以分支关系定义的层次结构。

在这种结构中,每个数据元素至多只有一个前驱,但可以有多个后继;数据元素之间的关系是一对多的层次关系。

树形结构主要用于描述客观世界中具有层次结构的数据关系,它在客观世界中大量存在。

遍历二叉树的实质是将非线性结构转为线性结构。

三使用仪器,材料计算机 2 Wndows xp 3 VC6.0四实验步骤【问题描述】建立一个二叉树,请分别按前序,中序和后序遍历该二叉树。

【基本要求】从键盘接受输入(按前序顺序),以二叉链表作为存储结构,建立二叉树(以前序来建立),并采用递归算法对其进行前序,中序和后序遍历,将结果输出。

【实现提示】按前序次序输入二叉树中结点的值(一个整数),0表示空树,叶子结点的特征是其左右孩子指针为空。

五实验过程原始记录基本数据结构描述; 2 函数间的调用关系;用类C语言描述各个子函数的算法;附录:源程序。

六试验结果分析将实验结果分析、实验中遇到的问题和解决问题的方法以及关于本实验项目的心得体会,写在实验报告上。

第二篇:数据结构-二叉树的遍历实验报告实验报告课程名:数据结构(C语言版)实验名:二叉树的遍历姓名:班级:学号:时间:2014.11.03一实验目的与要求1.掌握二叉树的存储方法2.掌握二叉树的三种遍历方法3.实现二叉树的三种遍历方法中的一种二实验内容• 接受用户输入一株二叉树• 输出这株二叉树的前根, 中根, 后根遍历中任意一种的顺序三实验结果与分析//*********************************************************** //头文件#include #include //*********************************************************** //宏定义#define OK 1 #define ERROR 0 #define OVERFLOW 0//*********************************************************** typedef struct BiTNode { //二叉树二叉链表存储结构char data;struct BiTNode *lChild,*rChild;}BiTNode,*BiTree;//******************************** *************************** int CreateBiTree(BiTree &T){ //按先序次序输入二叉中树结点的值,空格表示空树//构造二叉链表表示的二叉树T char ch;fflush(stdin);scanf(“%c”,&ch);if(ch==' ')T=NULL;else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return(OVERFLOW);T->data=ch;Creat eBiTree(T->lChild);CreateBiTree(T->rChild);} return(OK);} //********************************************************* void PreOrderTraverse(BiTree T){ //采用二叉链表存储结构,先序遍历二叉树的递归算法if(T){ printf(“%c”,T->data);PreOrderTraverse(T->lChild);PreOrd erTraverse(T->rChild);} } /***********************************************************/ void InOrderTraverse(BiTree T){ //采用二叉链表存储结构,中序遍历二叉树的递归算法if(T){ InOrderTraverse(T->lChild);printf(“%c”,T->data);InOrderT raverse(T->rChild);} }//*********************************************************** void PostOrderTraverse(BiTree T){ //采用二叉链表存储结构,后序遍历二叉树的递归算法if(T){ PostOrderTraverse(T->lChild);PostOrderTraverse(T->rChild) ;printf(“%c”,T->data);} }//*********************************************************** void main(){ //主函数分别实现建立并输出先、中、后序遍历二叉树printf(“please input your tree follow the PreOrder:n”);BiTNode *Tree;CreateBiTree(Tree);printf(“n先序遍历二叉树:”);PreOrderTraverse(Tree);printf(“n中序遍历二叉树:”);InOrderTraverse(Tree);printf(“n后序遍历二叉树:”);PostOrderTraverse(Tree);}图1:二叉树的遍历运行结果第三篇:数据结构二叉树操作验证实验报告班级:计算机11-2 学号:40 姓名:朱报龙成绩:_________实验七二叉树操作验证一、实验目的⑴ 掌握二叉树的逻辑结构;⑵ 掌握二叉树的二叉链表存储结构;⑶ 掌握基于二叉链表存储的二叉树的遍历操作的实现。

江苏大学数据结构上机实验报告

江苏大学数据结构上机实验报告

上机实验报告课程名称:数据结构A 实验题目:二叉树操作专业班级:计算机1501 学号:3150602020 姓名:经普杰完成日期:2016.11.1 成绩:实验内容、目的和要求(一)实验内容二叉树的建立和遍历。

(二)实验目的1.进一步掌握指针变量的使用。

2.掌握二叉树的结构特征以及各种存储结构的特点及使用范围。

3.掌握用指针类型描述、访问和处理二叉树的运算。

4.掌握栈或队列的使用。

(三)实验要求本实验要求实现以下功能:1.按前序次序建立一棵二叉树,以‘#’表示空。

2.中序、后序遍历该二叉树,输出遍历序列。

3.求出该二叉树的深度并输出,或求出该二叉树的叶子数目并输出。

4.试以栈为辅助存储结构实现二叉树的前序非递归算法或以队列为辅助存储结构实现二叉树的层次遍历算法。

程序中使用的数据结构及符号说明主要使用了While循环语句for循环语句二叉树链表的建立对二叉树的遍历计算二叉树的高度计算叶子节点的数量程序的主要流程图程序主要模块的功能说明本程序分为四个类建立,分别为node类,linkqueue类,bintreenode类,bintreelink类四个类中node类:定义一个普通节点类,用于构建队列类Linkqueue类:这是一个队列类,用于进行二叉链表的层次遍历,将二叉链表中的数据入队再出队以达到层次遍历的目的。

Bintreenode类:是建立一个二叉链表节点类,建立这样一个类,组成二叉链表。

即二叉链表是由多个二叉链表类节点组合而成的。

这个类中应包括,二叉树中的一个节点的全部内容,包括数据data,左子树leftchild,右子树rightchild,其中操作是对bintreenode进行初始化。

Bintreelink类:是整个程序的主要部分,这是一个二叉链表类,这个类由多个二叉链表类节点组成,这个链表即为二叉树的体现,在这个类中,包括对二叉树的操作。

首先,定义数据成员:二叉树根节点。

包括一系类对二叉链表的操作的函数成员:preorder(先序遍历)inorder (中序遍历),postorder(后续遍历),levelorder(层次遍历)height求二叉树的高度,leaf 求二叉树叶子节点数。

二叉树的基本操作实验报告

二叉树的基本操作实验报告

二叉树的基本操作实验报告学号姓名实验日期 2012-12-26实验室计算机软件技术实验指导教师设备编号 401实验内容二叉树的基本操作一实验题目实现二叉树的基本操作的代码实现二实验目的1、掌握二叉树的基本特性2、掌握二叉树的先序、中序、后序的递归遍历算法3、通过求二叉树的深度、度为2的结点数和叶子结点数等算法三实习要求(1)认真阅读书上给出的算法(2)编写程序并独立调试四、给出二叉树的抽象数据类型ADT BinaryTree{//数据对象D:D是具有相同特性的数据元素的集合。

//数据关系R:// 若D=Φ,则R=Φ,称BinaryTree为空二叉树;// 若D?Φ,则R={H},H是如下二元关系;// (1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱; // (2)若D-{root}?Φ,则存在D-{root}={D1,Dr},且D1?Dr =Φ; // (3)若D1?Φ,则D1中存在惟一的元素x1,<root,x1>?H,且存在D1上的关系H1 ?H;若Dr?Φ,则Dr中存在惟一的元素xr,<root,xr>?H,且存在上的关系Hr ?H;H={<root,x1>,<root,xr>,H1,Hr};// (4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树;(Dr,{Hr})是一棵符合本定义的二叉树,称为根的右子树。

//基本操作:CreateBiTree( &T, definition ) // 初始条件:definition给出二叉树T的定义。

// 操作结果:按definiton构造二叉树T。

BiTreeDepth( T )// 初始条件:二叉树T存在。

// 操作结果:返回T的深度。

PreOrderTraverse( T, visit() ) // 初始条件:二叉树T存在,Visit是对结点操作的应用函数。

二叉树上机报告

二叉树上机报告

二叉树输出姓名拼音一、问题描述建立连式存储结构的二叉树,在对其进行中序遍历时能够输出学生姓名的拼音,要求编写使用递归算法和非递归算法两种情况下完成要求的程序。

二、算法思想建立二叉树部分:⑴ 按照结点的序号,依次输入结点信息,若输入结点不是虚结点,则建立一个新结点。

⑵ 若新结点是第一个结点,则令其为根结点,否则将新结点作为孩子连接到他的双亲结点上。

⑶ 如此反复进行,直到输入结束标志“#”为止。

① 递归算法情况下:利用二叉树递归的定义,二叉树的遍历只需依次遍历二叉树的三个基本部分:左子树、根结点、右子树。

② 非递归算法部分:当指针p 所指的结点非空时,将该结点的存储地址进栈,然后再将p 指向该结点的左孩子结点。

当指针p 所指的结点为空时,从栈顶退出栈顶元素送p ,并访问该节点然后再将指针p 指向该结点的右孩子结点。

如此反复,直到p 为空且栈顶指针top=-1为止。

三、程序流程图 建立二叉链表的流程图是否是是否开始输入一个字符 该字符是否为结束标志 该字符是否为虚结点 新结点或虚结点指针入队 建立新结点 当前字符是否为第一个节点该结点作为根结点 队尾指针为偶数新结点是左孩子,否则右孩子;队头左右孩子处理完毕出队否 结束程序构造的二叉树如图所示:学生姓名拼音:chenchuanchuan运行结果截图: 程序源代码如下:#include<stdio.h>#include<stdlib.h>#define maxsize 1024typedef char datatype;typedef struct node{datatype data;ah hn u c n c e c u n h astruct node *lchild,*rchild;}bitree;typedef struct{bitree *p[maxsize];int top;}seqstack;bitree *Creatree();void inorder(bitree*);void ninorder(bitree*);seqstack*Initstack();int empty(seqstack*);int push(seqstack*,bitree*);bitree *pop(seqstack*);void main(){bitree *R;R=Creatree();inorder(R);printf("\n");ninorder(R);printf("\n");}bitree *Creatree(){char ch;bitree *q[maxsize];int front,rear;bitree *root,*s;root=NULL;front=1;rear=0;while((ch=getchar())!='#'){s=NULL;if(ch!='@'){s=(bitree*)malloc(sizeof(bitree));s->data=ch;s->lchild=NULL;s->rchild=NULL;}rear++;q[rear]=s;if(rear==1) root=s;else{if(s&&q[front])if(rear%2==0) q[front]->lchild=s;else q[front]->rchild=s;if(rear%2==1) front++;}}return root;}void inorder(bitree*p){if(p!=NULL){inorder(p->lchild);printf("%c",p->data);inorder(p->rchild);}}void ninorder(bitree*T){seqstack *s;bitree *p=T;s=Initstack();while(p!=NULL||empty(s)){if(p!=NULL){push(s,p);p=p->lchild;}else{p=pop(s);printf("%c",p->data);p=p->rchild;}}}seqstack *Initstack(){seqstack *s;s=(seqstack*)malloc(sizeof(seqstack));s->top=0;return s;}int empty(seqstack*s){if(s->top<=0) return 1;else return 0;}int push(seqstack*s,bitree *e){s->p[++s->top]=e;return 1;}bitree *pop(seqstack*s){bitree *e;e=s->p[s->top--];return e;}。

树和二叉树的实验报告

树和二叉树的实验报告

《数据结构》实验报告题目: 树和二叉树一、用二叉树来表示代数表达式(一)需求分析输入一个正确的代数表达式, 包括数字和用字母表示的数, 运算符号+ - * / ^ =及括号。

系统根据输入的表达式建立二叉树, 按照先括号里面的后括号外面的, 先乘后除的原则, 每个节点里放一个数字或一个字母或一个操作符, 括号不放在节点里。

分别先序遍历, 中序遍历, 后序遍历此二叉树, 并输出表达式的前缀式, 中缀式和后缀式。

(二)系统设计1.本程序中用到的所有抽象数据类型的定义;typedef struct BiNode //二叉树的存储类型{char s[20];struct BiNode *lchild,*rchild;}BiTNode,*BiTree;2.主程序的流程以及各程序模块之间的层次调用关系, 函数的调用关系图:3. 列出各个功能模块的主要功能及输入输出参数void push(char cc)初始条件: 输入表达式中的某个符号操作结果: 将输入的字符存入buf数组中去BiTree Create_RTree()初始条件: 给出二叉树的定义表达式操作结果:构造二叉树的右子树, 即存储表达式等号右侧的字符组BiTree Create_RootTree()初始条件: 给出二叉树的定义表达式操作结果:构造存储输入表达式的二叉树, 其中左子树存储‘X’, 根节点存储‘:=’void PreOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:先序遍历T, 对每个节点调用函数Visit一次且仅一次void InOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:中序遍历T, 对每个节点调用函数Visit一次且仅一次void PostOrderTraverse(BiTree T)初始条件: 二叉树T存在操作结果:后序遍历T, 对每个节点调用函数Visit一次且仅一次int main()主函数, 调用各方法, 操作成功后返回0(三)调试分析调试过程中还是出现了一些拼写错误, 经检查后都能及时修正。

数据结构二叉树实验报告

数据结构二叉树实验报告

数据结构二叉树实验报告1. 引言二叉树是一种常见的数据结构,由节点(Node)和链接(Link)构成。

每个节点最多有两个子节点,分别称为左子节点和右子节点。

二叉树在计算机科学中被广泛应用,例如在搜索算法中,二叉树可以用来快速查找和插入数据。

本实验旨在通过编写二叉树的基本操作来深入理解二叉树的特性和实现方式。

2. 实验内容2.1 二叉树的定义二叉树可以用以下方式定义:class TreeNode:def__init__(self, val):self.val = valself.left =Noneself.right =None每个节点包含一个值和两个指针,分别指向左子节点和右子节点。

根据需求,可以为节点添加其他属性。

2.2 二叉树的基本操作本实验主要涉及以下二叉树的基本操作:•创建二叉树:根据给定的节点值构建二叉树。

•遍历二叉树:将二叉树的节点按照特定顺序访问。

•查找节点:在二叉树中查找特定值的节点。

•插入节点:向二叉树中插入新节点。

•删除节点:从二叉树中删除特定值的节点。

以上操作将在下面章节详细讨论。

3. 实验步骤3.1 创建二叉树二叉树可以通过递归的方式构建。

以创建一个简单的二叉树为例:def create_binary_tree():root = TreeNode(1)root.left = TreeNode(2)root.right = TreeNode(3)root.left.left = TreeNode(4)root.left.right = TreeNode(5)return root以上代码创建了一个二叉树,根节点的值为1,左子节点值为2,右子节点值为3,左子节点的左子节点值为4,左子节点的右子节点值为5。

3.2 遍历二叉树二叉树的遍历方式有多种,包括前序遍历、中序遍历和后序遍历。

以下是三种遍历方式的代码实现:•前序遍历:def preorder_traversal(root):if root:print(root.val)preorder_traversal(root.left)preorder_traversal(root.right)•中序遍历:def inorder_traversal(root):if root:inorder_traversal(root.left)print(root.val)inorder_traversal(root.right)•后序遍历:def postorder_traversal(root):if root:postorder_traversal(root.left)postorder_traversal(root.right)print(root.val)3.3 查找节点在二叉树中查找特定值的节点可以使用递归的方式实现。

二叉树的基本操作与实现实验报告

二叉树的基本操作与实现实验报告

二叉树的基本操作与实现实验报告二叉树是一种重要的数据结构,在计算机科学领域中被广泛应用。

本实验将介绍二叉树的基本操作与实现,并给出相应的实验报告。

一、引言二叉树是一种特殊的树状结构,每个节点至多有两个子节点。

二叉树有许多重要的特性,如平衡二叉树、二叉树等,应用广泛。

在本实验中,我们将介绍二叉树的基本操作和实现。

二、实验目的1.掌握二叉树的基本概念和特性;2.熟悉二叉树的基本操作,包括创建、插入、删除、遍历等;3.学会使用编程语言实现二叉树的基本操作。

三、实验内容本实验主要包括以下内容:1.二叉树的定义和基本概念;2.二叉树的基本操作,包括创建、插入、删除、遍历等;3.使用编程语言实现二叉树的基本操作;4.测试和验证二叉树的基本操作的正确性。

四、实验步骤1.二叉树的定义和基本概念二叉树是一种树状结构,每个节点至多有两个子节点。

二叉树的每个节点包含一个数据项和指向左子树和右子树的指针。

二叉树的特性有很多,如完全二叉树、平衡二叉树、二叉树等。

2.二叉树的基本操作(1)创建二叉树:可以通过手动输入节点数据来创建二叉树,也可以通过读取文件中的数据来创建二叉树。

(2)插入节点:在指定位置插入一个新节点。

(3)删除节点:删除指定位置的节点。

(4)遍历二叉树:有前序遍历、中序遍历和后序遍历三种遍历方式。

3.使用编程语言实现二叉树的基本操作实现二叉树的基本操作可以使用编程语言来完成。

我们可以定义一个二叉树的结构体,包含节点数据和指向左右子树的指针。

然后根据具体的需求,实现相应的操作函数。

4.测试和验证二叉树的基本操作的正确性在完成二叉树的基本操作后,我们可以编写测试代码来验证操作的正确性。

通过创建二叉树,并进行插入、删除和遍历操作,观察输出结果是否符合预期。

五、实验结果与分析在完成二叉树的基本操作后,我们可以进行测试和验证。

通过输出二叉树的遍历结果,比对预期结果来判断操作是否正确。

同时,我们还可以观察二叉树的结构和特性,如是否满足平衡二叉树或二叉树的条件。

二叉树上机报告

二叉树上机报告

二叉树上机实习报告专业班级:计算机科学与技术学号: 姓名: 完成日期:(一)问题的描述:实现二叉树的数据结构以及实现二叉树递归法和非递归法的先序、中序、后序遍历以及求二叉树的节点个数、子节点个数、和深度数据结构的设计:typedef struct node{int data;struct node *lchild,*rchild;}Bitree;(三)函数功能、参数说明及概要设计:(1)BiTtree* Creattree()功能说明:构建二叉树(2)void preoder(Bitree *bt)功能说明:对二叉树bt进行递归先序遍历(3)void inoder(Bitree *bt)功能说明:对二叉树bt进行递归中序遍历(4)void lastoder(Bitree *bt)功能说明:对二叉树bt进行递归后序遍历(5)void preorder2(Bitree *bt)功能说明:对二叉树bt进行非递归先序遍历(6)void inorder2(Bitree *bt)功能说明:对二叉树bt进行非递归中序遍历(7)void lastorder2(Bitree *bt)功能说明:对二叉树bt进行非递归中序遍历(8)int SumTree(Bitree *bt)功能说明:计算二叉树bt节点个数(9)int PPreOrder(Bitree *root)功能说明:计算二叉树bt子节点个数(10)int treedepth(Bitree* bt)功能说明:计算二叉树bt深度(四)具体程序的实现#include<stdio.h>#include<malloc.h>typedef struct node{int data;struct node *lchild,*rchild;}Bitree; //定义二叉树的数据类型结构BiTtree* creattree()//先序遍历法建立二叉树{ int s;Bitree* T;scanf("%d",&s);if(s==0) T=NULL;else{T=(Bitree*)malloc(sizeof(tnode));T->data=s;T->lchild=creattree();T->rchild=creattree();}return T;}void preoder(Bitree *T)//递归先序遍历{if(T!=NULL)//当T指针不空时先输出它所存的数据再依次遍历它的左孩子和右孩子{printf("%d ",T->data);preoder(T->lchild);preoder(T->rchild);}void inoder(Bitree *T)//递归中序遍历{if(T!=NULL)//当T指针不空时先再遍历它的左孩子再输出它所存的数据,最后遍历右孩子{inoder(T->lchild);printf("%d ",T->data);inoder(T->rchild);}}void lastoder(Bitree *T)//递归后序遍历{if(T!=NULL)//当T指针不空时先再遍历它的左孩子和右孩子再输出它所存的数据{lastoder(T->lchild);lastoder(T->rchild);printf("%d ",T->data);}}void preorder2(Bitree *bt)/*非递归先序遍历*/{Bitree *p,*stack[50];int top;top=0;stack[top]=bt; top++;while(top>0){p=stack[top-1]; top--;while(p!=NULL)printf("%d ",p->data);stack[top]=p->rchild;top++;p=p->lchild;}}}void inorder2(Bitree *bt)/*非递归中序遍历*/ {Bitree *p,*stack[50];int top;top=0; p=bt;while(top!=0||p!=NULL){while(p!=NULL){stack[top]=p; top++;p=p->lchild;}if(top!=0){p=stack[top-1];top--;printf("%d ",p->data);p=p->rchild;}}}void lastorder2(Bitree *bt)//非递归法的后序遍历{Bitree *stack[50],*p=NULL;int top=0;while(top!=0||bt!=NULL)while(bt!=NULL){stack[top++]=bt;bt=bt->lchild;}if(top!=0){bt=stack[top-1];if(bt->rchild==NULL||bt->rchild==p){printf("%d ",bt->data);top--;p=bt;bt=NULL;}else{bt=bt->rchild;}}}}int SumTree(Bitree *bt)//求节点个数{static int sum=0;if(bt!=NULL){sum++;sum=SumTree(bt->lchild);sum=SumTree(bt->rchild);}return(sum);}int PPreOrder(Bitree *root)//求子节点个数{Static int total=0;if(root){if(root->lchild==0&&root->rchild==0)total++;PPreOrder(root->lchild);PPreOrder(root->rchild);}return total;}int treedepth(Bitree* bt)//二叉树深度{int lt,rt,max;if(bt){lt=treedepth(bt->lchild);rt=treedepth(bt->rchild);if(lt>rt)max=lt;else max=rt;return(max+1);}else return 0;}void main(){Bitree *start;printf("================递归遍历二叉树==================\n");start=Creattree();printf("****************先序结果为******************\n");preoder(start);printf("\n");printf("****************中序结果为******************\n");inoder(start);printf("\n");printf("****************后序结果为******************\n");lastoder(start);printf("\n");printf("================非递归遍历二叉树=================\n");printf("\n****************先序结果为******************\n");preorder2(start);printf("\n");printf("****************中序结果为******************\n");inorder2(start);printf("\n");printf("****************后序结果为******************\n");lastorder2(start);printf(“\n”);printf("\n树的节点个数为%d\n",SumTree(start));printf("树的子节点个数为%d\n",PPreOrder(start));printf("树的深度为%d\n",treedepth(start));}(五)主界面设计(六)调试情况1.可能出现的情况:在输入数据时由于是先序遍历法输入数据,有时没有输入够个数自己又不知道,导致程序不运行,当一直输入为0时最后得以解决(七)算法的分析和评价及本次实验心得(1)算法分析:递归遍历法较简单但不易分析,非递归遍历法容易理解但不容易写出,导致时间复杂度较大,程序运行速度慢(2)实验心得:通过这次试验,我也充分体会到,当处理代码量较大的算法时,要是没有足够的耐心与很好的结构书写习惯,很难将算法写出来,而且更没有耐心将算法分析并得以解决,导致恶性循环。

二叉树实验报告总结(共10篇)

二叉树实验报告总结(共10篇)

二叉树实验报告总结(共10篇)二叉树实验报告实验报告课程名称算法与数据结构专业学号姓名实验日期算法与数据结构实验报告一、实验目的1.了解二叉树的结构特点及有关概念,掌握二叉树建立的基本算法2.了解二叉树遍历的概念,掌握遍历二叉的算法3.进一步掌握树的结构及非线性特点,递归特点和动态性。

二、实验内容二叉树的实现和运算三、实验要求1.用C++/C完成算法设计和程序设计并上机调试通过。

2.撰写实验报告,提供实验结果和数据。

3.分析算法,并简要给出算法设计小结和心得。

四、算法步骤用户以三元组形式输入二叉树的结点元素及其位置关系,建立二叉树,并打印输出该二叉树。

用户输入选择结点,程序调用BiTNode* Find Node(char tag, BiTNode* node)函数,返回子树的根结点,然后调用BiTreeDepth(BiTree T)函数,求出子树的深度,并输出该值。

3.用户可以选择是否继续执行程序,若继续,则输入1,否则输入0,结束程序。

五、主程序代码:int main(void){BiTree T;TElemType e1;char node; // node为用户选择输入的结点//int b,choose; // b为以选定结点为子树的深度,choose为实现多次选择输入的标志//BiTNode* a; // a为选定结点为子树的根结点//choose=1; // 多次选择的标志,当choose为1时运行程序,为0时结束程序// InitBiTree(T);printf(构造空二叉树后,树空否?%d(1:是0:否), 树的深度=%d\n,BiTreeEmpty(T),BiTreeDepth(T));e1 = Root(T);if(e1 != Nil)#ifdef CHARprintf(二叉树的根为: %c\n,e1);#endif#ifdef INTprintf(二叉树的根为: %d\n,e1);#endifelseprintf(树空,无根\n); //三元组构建二叉树striile(x!=end){AddNode(T, x[0], x[1], x[2]);GetUserWord(x);} //输出树PrintTreeLevel( T );//以三元组形式输入任意二叉树(以大写字母表示结点),求以任意一选定结点为子树的深度。

基于二叉树的表达式求值算法实验报告

基于二叉树的表达式求值算法实验报告

基于二叉树的表达式求值算法实验报告一、实验目的1. 学习基于二叉树的表达式求值算法。

2. 掌握二叉树的遍历方法和递归算法。

3. 设计并实现基于二叉树的表达式求值程序。

二、实验环境操作系统:Windows 10开发环境:Visual Studio Code 1.57.1编程语言:C++三、算法描述1. 表达式转二叉树将中缀表达式转换为二叉树的过程可以通过递归算法实现。

具体步骤如下:(1)如果表达式只有一个数字,那么将其作为叶子节点返回。

(2)如果表达式包含多个操作符,则以操作符优先级最低的操作符为根节点,将表达式分成两部分,分别递归处理左子树和右子树。

(3)如果表达式中有括号,则将括号中的表达式作为一棵子树递归处理。

2. 表达式求值二叉树求值的过程可以通过递归算法实现。

对于一个二叉树节点,分别计算其左子树和右子树的值,并根据节点的操作符计算节点的值。

具体步骤如下:(1)如果节点是叶子节点,则其值为对应数字。

(2)如果节点是加法节点,则将左右子树的值相加。

(3)如果节点是减法节点,则将左子树的值减去右子树的值。

(4)如果节点是乘法节点,则将左右子树的值相乘。

(5)如果节点是除法节点,则将左子树的值除以右子树的值。

四、实验步骤1. 定义二叉树节点结构体c++struct node {char oper; 节点的操作符double val; 节点的值node* left; 左子树节点node* right; 右子树节点};2. 实现表达式转二叉树函数c++node* expressionToTree(string exp) { int len = exp.length();node* root = NULL;如果表达式是一个数字if (len == 1) {root = new node;root->oper = '#';root->val = exp[0] - '0';root->left = NULL;root->right = NULL;return root;}如果表达式包含多个操作符int pos = 0, priority = 0;for (int i = 0; i < len; i++) {if (exp[i] == '(') {priority += 10;continue;}if (exp[i] == ')') {priority -= 10;continue;}if (exp[i] == '+' exp[i] == '-') {if (priority <= 1) {root = new node;root->oper = exp[i];root->left = expressionT oTree(exp.substr(pos, i - pos));root->right = expressionToTree(exp.substr(i + 1));return root;}}if (exp[i] == '*' exp[i] == '/') {if (priority <= 2) {root = new node;root->oper = exp[i];root->left = expressionT oTree(exp.substr(pos, i - pos));root->right = expressionToTree(exp.substr(i + 1));return root;}}}return root;}3. 实现表达式求值函数c++double evaluate(node* root) {if (root == NULL) return 0.0;if (root->left == NULL && root->right == NULL) return root->val;double left_val = evaluate(root->left), right_val =evaluate(root->right);switch (root->oper) {case '+': return left_val + right_val;case '-': return left_val - right_val;case '*': return left_val * right_val;case '/': return left_val / right_val;default: return 0.0;}}4. 测试程序c++int main() {string exp = "((5-2)*(3+4))/7";node* root = expressionToTree(exp);cout << exp << " = " << evaluate(root) << endl; 输出结果为3 return 0;}五、实验结果分析本实验设计并实现了基于二叉树的表达式求值程序。

数据结构上机实验报告-二叉树

数据结构上机实验报告-二叉树

数据结构上机实验报告二叉树问题陈冠豪20102105010101015二O一O年5月26号实验目的建立一棵二叉树,要求分别用递归和非递归方法实现二叉树的先序、中序和后序遍历。

实现代码:#ifndef TREE_H#define TREE_H#include <stdio.h> #include <malloc.h> #include <stack>#include <queue>#include <assert.h> using namespace std; typedefintElemType;typedef struct treeT {ElemType key;struct treeT* left;struct treeT* right; }treeT, *pTreeT;static void visit(pTreeT root){if (NULL != root){printf(" %d\n", root->key);}}static pTreeT BT_MakeNode(ElemType target){pTreeT pNode = (pTreeT) malloc(sizeof(treeT)); assert( NULL != pNode );pNode->key = target;pNode->left = NULL;pNode->right = NULL;return pNode;}pTreeT BT_Insert(ElemType target, pTreeT* ppTree) {pTreeT Node;assert( NULL != ppTree );Node = *ppTree;if (NULL == Node){return *ppTree = BT_MakeNode(target);}if (Node->key == target) //不允许出现相同的元素 {return NULL;}else if (Node->key > target) //向左{return BT_Insert(target, &Node->left);}else{return BT_Insert(target, &Node->right);}}void BT_PreOrder(pTreeT root){if (NULL != root){visit(root);BT_PreOrder(root->left);BT_PreOrder(root->right);}}void BT_PreOrderNoRec(pTreeT root) {stack<treeT *> s;while ((NULL != root) || !s.empty()) {if (NULL != root){visit(root);s.push(root);root = root->left;}else{root = s.top();s.pop();}}void BT_InOrder(pTreeT root){if (NULL != root){BT_InOrder(root->left);visit(root);BT_InOrder(root->right);}}void BT_InOrderNoRec(pTreeT root) {stack<treeT *> s;while ((NULL != root) || !s.empty()) {if (NULL != root){s.push(root);else{root = s.top();visit(root);s.pop();root = root->right;}}}void BT_PostOrder(pTreeT root) {if (NULL != root){BT_PostOrder(root->left); BT_PostOrder(root->right); visit(root);}}void BT_PostOrderNoRec(pTreeT root) {}void BT_LevelOrder(pTreeT root) {queue<treeT *> q;treeT *treePtr;assert( NULL != root );q.push(root);while (!q.empty()){treePtr = q.front();q.pop();visit(treePtr);if (NULL != treePtr->left){q.push(treePtr->left);}if (NULL != treePtr->right) {q.push(treePtr->right); }}}#endif#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX_CNT 5#define BASE 100void main(int argc, char *argv[]) {int i;char temp;pTreeT root = NULL;srand( (unsigned)time( NULL ) );printf("请输入元素:\nA.自动生成.\nB.手动输入.\n");do{temp=getchar();}while(!(temp=='A'||temp=='a'||temp=='B'||temp=='b'));if((temp)=='A'||(temp)=='a'){for (i=0; i<MAX_CNT; i++){BT_Insert(rand() % BASE, &root);}}else if((temp)=='B'||(temp)=='b'){printf("请输入元素,元素以#结尾\n");while((temp=getchar())!='#')BT_Insert(temp, &root);}//前序printf("PreOrder:\n");BT_PreOrder(root);printf("\n");printf("PreOrder no recursion:\n"); BT_PreOrderNoRec(root);printf("\n");//中序printf("InOrder:\n");BT_InOrder(root);printf("\n");printf("InOrder no recursion:\n"); BT_InOrderNoRec(root);printf("\n");//后序printf("PostOrder:\n");BT_PostOrder(root);printf("\n");//层序printf("LevelOrder:\n");BT_LevelOrder(root);printf("\n");}。

树与二叉树上机实验

树与二叉树上机实验

西安交通大学实验报告课程数据结构(C语言描述)实验报告名称树与二叉树上机实验系别专业班级姓名学号一.实验目的掌握二叉树的建立方法;理解二叉树的结构和前序遍历、中序遍历、后序遍历及按层次遍历的方法;学会用二叉树解决问题。

二.实验内容(-)实验题目一:设树中结点的定义为:struct BTreeNode {ElemType data;struct BTreeNode* left;struct BTreeNode* right;};下面是根据二叉树的前序序列来建立二叉树的子程序:void CreatBiTree(struct BTreeNode** T){char ch;scanf("\n%c",&ch);if(ch=='#') *T=NULL; /* “#” 代表空子树*/else {(*T)=malloc(sizeof(struct BTreeNode));(*T)->data=ch;CreatBiTree(&((*T)->left));CreatBiTree(&((*T)->right));}}设输入该二叉树的前序序列为:ABC##DE#G##F##HI##J#K##(#代表空子树)请编程完成下列任务:⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列,⑵按层次遍历的方法来输出该二叉树按层次遍历的序列;⑶求该二叉树的高度;⑷交换该二叉树的左右子树,并输出交换后新的二叉树中序遍历的结果;1.要点分析理解并正确运用二叉树的结构和遍历方法。

前序序列:ABC##DE#G##F##HI##J#K## 表示的二叉树为:所以根据二叉树的结构可知:其前序序列为:ABCDEGFHIJK中序序列为:CBEGDFAIHJK后序序列为:CGEFDBIKJHA按层次遍历的结果为:ABHCDIJEFKG交换左右子树后中序遍历的结果为:KJHIAFDGEBC深度为5。

数据结构上机实验报告7

数据结构上机实验报告7
二、实验环境
Turbo 2.0或相近的环境
三、实验内容
1)使用二叉链表或顺序表示法,表示算术表达式2*3+6/(3-1)的标识符树;
2)求标识符树的先序、中序、后序序列,显示遍历结果。要求将遍历的结果先存入一个数组中再显示。
附加:3)使用后序序列求表达式的值(使用栈实现);
四、算法描述及实验步骤
用算法表示方法,流程图等形式表达算法设计思想与算法实现步骤
数据结构上机实验报告7—AAXXX
课程名称:数据结构
年级:
实验日期:
姓名:xxx
学号:AA
班级:
实验名称:二叉树
实验序号:实验七
成员人数:
一、实验目的及要求
1.了解C语言程序的特点
2.掌握简单的C语言程序结构
3.熟练掌握运行C程序的步骤和方法
4.掌握二叉树的存储表示方法、二叉树的遍历
5.掌握利用后缀表示法计算表达式的值;
五、调试过程及实验结果
详细记录程序在调试过程中出现的问题及解决方法。
记录程序执行的结心得体会。
七、附录(源程序清单)

实验三二叉树及其应用(2次上机)

实验三二叉树及其应用(2次上机)

实验三 二叉树及其应用(2次上机)【上机时间】第5~7次【实验目的】树是一种应用极为广泛的数据结构之一,是本课程的重点。

树是一种1:N 的非线性结构。

本章首先以二叉树这种特殊、简单的树为原型,讨论数据元素(结点)之间的1:N(N=0,1,2)关系的表示(顺序映像——完全二叉树的顺序存储;链式映像——二叉链表、三叉链表);重点介绍二叉树的各种遍历算法(先序、中序、后序、层次遍历);并以这些遍历算法为基础,进一步讨论二叉树的其他各种问题的求解算法。

然后,展开对一般树的表示(双亲表示法、孩子表示法、孩子-兄弟表示法)和操作算法的讨论;强调树(森林)的孩子-兄弟表示法及其相关应用;并将表示树(森林)的孩子-兄弟链映射到表示二叉树的二叉链,从而获得树(森林)与二叉树的相互转换。

本实验以二叉树的链式表示、建立和应用为基础,旨在让学生深入了解二叉树的存储表示特征以及遍历次序与二叉树的存储结构之间的关系,进一步掌握利用遍历思想解决二叉树中相关问题的方法。

本实验的另一个目的是让学生通过思考、上机实践与分析总结,理解计算机进行算术表达式解析、计算的可能方法,初步涉及一些编译技术,增加自己今后学习编译原理的兴趣,并奠定一些学习的基础。

【实验内容】本实验由以下环节组成:1) 存储结构以二叉链表或三叉链表作为二叉树的存储结构;2) 二叉树的创建(链式存储)以某一种遍历的次序录入二叉树的元素,写出相应的二/三叉链表的创建算法,并上机实现该算法;二叉树的输入次序可以有如下几种方法,你可以选择其中之一来作为二/三叉链表创建程序的输入:(1) 添加虚结点补足成完全二叉树,对补足虚结点后的二叉树按层次遍历次序输入。

如图1的二叉树输入次序为:A, B, C, Φ, D, E, F, Φ, Φ, G , Φ, Φ, H也可以通过添加虚结点,为每一实在结点补足其孩子,再对补足虚结点后的二叉树按层次遍历的次序输入。

如图1的二叉树输入次序为:A, B, C, Φ, D, E, F, G , Φ, Φ, H , Φ, Φ, Φ, Φ, Φ, Φ进一步改进,可以在输入列表中忽略出现在列表尾部的虚结点,即:A, B, C, Φ, D, E, F, G , Φ, Φ, H(2) 通过添加虚结点,将二叉树中的每一实在结点补足成度为2的结点,对补足虚图 1结点后的二叉树按先序遍历的次序输入。

二叉树的使用报告--数据结构(C语言){修}

二叉树的使用报告--数据结构(C语言){修}

数据结构作业报告——二叉树的使用报告姓名:江海强班级:070921班学号:07092007上机时间:2010-10-14报告时间:2010-10-19摘要1.实验目的此程序主要是让我们了解二叉树的链式结构的存储,理解二叉树的遍历过程,完成对二叉树的创建,输出其先序遍历、中序遍历、后序遍历以及层次遍历等基本操作。

让我们实现二叉树的基本函数和能够针对递归结构的二叉树进行查询、修改、删除等操作。

2.实验方法主要是运用了递归法对二叉树进行先序遍历、中序遍历和后序遍历。

还适时定义了全局变量数组A[4][10]和静态变量depth,利用二叉树的性质实现了层次遍历,凹入法遍历等。

3.实验结果由二叉树的结构图可以知道其先序遍历、中序遍历、后序遍历和层次遍历等的结果,用其来和运行结果作对比,可以得出结果完全符合要求。

即是此程序是正确的,成功的。

内容一. 问题重述设计一个程序创建一个二叉树,编程打印该树的先序、中序、后序遍历序列和层次遍历序列,并且编程实现按照凹入表示法打印该树。

还要交换将该树所有左右子树,按照凹入表示法打印交换左右子树后的树。

最后输入待删除的结点内容,要求删除该结点子树,并打印删除后的二叉树。

而该二叉树要用Word 绘出设计出其图形。

二.算法描述本程序除了运用一些条件语句,判断语句,switch 语句之外,主要运用了程序自身调用递归法。

XianXu(),ZhongXu()和HouXu()这三个子函数的复杂度都为O(N),其中N 为二叉树的结点个数。

又XianXu()执行了两次,复杂度分别为O(N)和 O(N-2),即总的时间复杂度为3×O(9) + O(7)。

CengCi()的复杂度为O(40)。

AoRu()的复杂度为3×O(9)+ O(16),而AoRu()子函数执行了两次,故总的时间复杂度为6×O(9)+ 2×O(16)。

故所有输出型子函数的复杂度为:9×O(9)+ 2×O(16) + O(7)+ O(40)= O(160)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

表达式二叉树上机报告班级:11070227姓名:周潇学号:11070227完成日期:2013.4.10一、需求分析:(1)功能:表达式可以用二叉树表示,对于简单的四则运算,请实现以下功能【1】对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一棵表达式二叉树,并且图示出来(图形的形式)。

【2】对于构造好的内部表达式二叉树,按照用户的要求输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括)或后缀表达式(不带括号)。

提示:所谓中缀表达式中的冗余括号,就是去掉括号后不影响表达式的计算顺序。

例如:“(c+b)+a”中的括号是冗余的,可以表示成不冗余的“c+b+a”。

(2)输入输出要求:请输入字符串表达式形式,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1:树形二叉树(图形显示)中缀表达式为:前缀表达式为:后缀表达式为:(3)测试数据:(1)请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1. -1;请输入字符串表达式:-+7*254-+ 47 *2 5中缀表达式为:7+2*5-4前缀表达式为:-+7*254后缀表达式为:725*+4-cout<<"----------function end-----------"<<endl;(2)请输入字符串表达式:7+2*5-4-+ 47 *2 5中缀表达式为:7+2*5-4前缀表达式为:-+7*254后缀表达式为:725*+4-cout<<"----------function end-----------"<<endl; (3)请输入字符串表达式:123*+4--+ 47 *2 5中缀表达式为:7+2*5-4前缀表达式为:-+7*254后缀表达式为:725*+4-cout<<"----------function end-----------"<<endl; 二.概要设计:建立表达式树就是建立树中的每一个结点,将每一个结点链接起来就是整棵树。

而在建立深度低的结点时要将其左右指针指向之前建立的深度比它高一级的结点(如’*’要指向’2’和’3’,而’+’又要指向’*’)。

这样我们可以用栈来存放每次建立的结点,按照优先级(表达式为中缀型)或顺序扫描表达式(表达式为波兰式与逆波兰式)建立每一个结点。

建立结点的顺序即为表达式求值的顺序。

如果扫描到操作数则直接新建一个左右指针为空的结点,并压入结点栈中(存放结点指针)。

遇到运算符时首先新建一个结点,然后从栈中依次弹出两个结点,并让新建立的结点的左右指针域指向它们。

当所有结点建立完毕时,如果表达式没有错误(这里假设输入表达式正确),这时栈中应该只剩下一个结点,它就是所建立的表达式的根结点。

三.详细设计:bool isOper(char op) //判断是否为运算符{char oper[]={'(',')','+','-','*','/','^'};for(int i=0;i<sizeof(oper);i++){ if(op==oper[i]){return true;}}return false;}void postOrder(TNode *p) //递归先序周游二叉树{ if(p){ postOrder(p->left);postOrder(p->right);cout<<p->oper;}}void preOrder(TNode *p) //递归后序周游二叉树{ if(p){ cout<<p->oper;preOrder(p->left);preOrder(p->right);} }void inOrder(TNode *p) //递归中序遍历{ if(p){if(p->left){ //如果当前节点的左子树是运算符,且运算符优先级低于当前运算符,//那么左边的表达式要先计算,需要加括号if(isOper(p->left->oper)&& getOperOrder(p->left->oper)<getOperOrder(p->oper)) {cout<<"(";inOrder(p->left);cout<<")";}elseinOrder(p->left);}cout<<p->oper;//输出当前节点if(p->right){ //如果当前节点的右子树是运算符,且运算符优先级不高于当前运算符,//那么右边的表达式要先计算,需要加括号if(isOper(p->right->oper)&& getOperOrder(p->right->oper)<=getOperOrder(p->oper)) {cout<<"(";inOrder(p->right);cout<<")";}elseinOrder(p->right);}}}四.调试分析:调试过程中会遇到许多问题,语法的错误,逻辑的错误,以及算法的错误,根据错误的提示做相应的修改,本程序所需算法很多,不仅需要把一种表达式转换为其余两种,而且还要够造为二叉树,并以图的形式输出五.用户使用说明:按照提示输入表达式的类型,-1表示前缀表达式,0表示中缀表达式,1表示后缀表达式然后再根据提示输入字符串表达式,按enter即可得到用户所需的结果六.测试结果:七.源程序清单:#include <iostream>#include <stack>#include <queue>#include <string>#include<math.h>using namespace std;class BinT{public:char oper;BinT *left;BinT *right;int s;int t; //计算树的层数使用BinT(){left=right=NULL; // 初始化左右子数oper=0;}BinT(char op){ left=right=NULL;oper=op;}};bool isOper(char op) //判断是否为运算符{char oper[]={'(',')','+','-','*','/','^'};for(int i=0;i<sizeof(oper);i++){ if(op==oper[i]){return true;}}return false;}int getOperOrder(char op) //返回运算符op所对应的优先级{ // 左括号优先级,加减号为,乘除号为,方幂为,右括号,栈底返回switch(op){case '(': return 1;case '+':case '-':return 2;case '*':case '/':return 3;case '^':return 4;default://定义在栈中的右括号和栈底字符的优先级最低return 0;}}void freeTree(TNode *&p) //递归删除树{if(p->left!=NULL)freeTree(p->left);if(p->right!=NULL)freeTree(p->right);delete(p);}void postOrder(TNode *p) //递归先序周游二叉树{ if(p){ postOrder(p->left);postOrder(p->right);cout<<p->oper;}}void preOrder(TNode *p) //递归后序周游二叉树{ if(p){ cout<<p->oper;preOrder(p->left);preOrder(p->right);} }void inOrder(TNode *p) //递归中序遍历{ if(p){if(p->left){ //如果当前节点的左子树是运算符,且运算符优先级低于当前运算符,//那么左边的表达式要先计算,需要加括号if(isOper(p->left->oper)&& getOperOrder(p->left->oper)<getOperOrder(p->oper)) {cout<<"(";inOrder(p->left);cout<<")";}elseinOrder(p->left);}cout<<p->oper;//输出当前节点if(p->right){ //如果当前节点的右子树是运算符,且运算符优先级不高于当前运算符,//那么右边的表达式要先计算,需要加括号if(isOper(p->right->oper)&& getOperOrder(p->right->oper)<=getOperOrder(p->oper)) {cout<<"(";inOrder(p->right);cout<<")";}elseinOrder(p->right);}}}void post2tree(TNode *&p,string str)//后缀表达式生成二叉树{stack <TNode*> nodeStack;//用于保存节点指针的栈char temp;int i=0;temp=str[i++];while(temp!='\0'){if(temp!='\0'&&!isOper(temp)) //不是运算符,则进栈{p=new TNode(temp); //以temp为结点值构造二叉树结点nodeStack.push(p);temp=str[i++]; //读入下一个}else{ //如果遇到符号,则弹栈,依次设为右节点和左节点p=new TNode(temp);if(nodeStack.size()){p->right=nodeStack.top();//若非空则弹栈并设为结点的右孩子nodeStack.pop();}if(nodeStack.size()){p->left=nodeStack.top();//若非空则弹栈并设为结点的左孩子nodeStack.pop();}nodeStack.push(p);temp=str[i++];}}}void pre2tree(TNode *&p, string str) //前缀表达式生成二叉树{stack <TNode*> nodeStack;char temp;int i=str.size()-1;temp=str[i--];while(temp!='\0'){if(temp!='\0'&&!isOper(temp)){ p=new TNode(temp); //以temp为内容来建立新的结点nodeStack.push(p);temp=str[i--];}else{ p=new TNode(temp);if(nodeStack.size()) //栈非空{ p->left=nodeStack.top(); //则栈顶指针所指结点设置成当前结点左孩子nodeStack.pop();}if(nodeStack.size()){ p->right=nodeStack.top(); //则栈顶指针所指结点设置成当前结点右孩子nodeStack.pop(); //栈顶元素左右孩子指针设置完毕弹出}nodeStack.push(p);temp=str[i--];}}}void in2tree(TNode *&p, string str) //中缀表达式转换成后缀表达式生成二叉树{stack<char> a;char temp;string Postfixexp="";int i=0;temp=str[i++];while(temp!='\0'){if(!isOper(temp))//操作数则直接进数据栈{ Postfixexp+=temp;temp=str[i++];}else if(temp=='(')//进栈{a.push(temp);temp=str[i++];}else if(temp==')'){while(a.top()!='(')//脱括号{Postfixexp+=a.top();a.pop(); //在碰到开括号和栈为空前反复弹出栈中元素}a.pop();temp=str[i++];}else if(temp=='+'||temp=='-'||temp=='*'||temp=='/')//出栈{while(!a.empty()&&a.top()!='('&&getOperOrder(a.top())>=getOperOrder(temp)){ Postfixexp+=a.top(); a.pop(); }a.push(temp);temp=str[i++];}}//end while(temp!='\0')while(!a.empty()){ Postfixexp+=a.top();a.pop();}Postfixexp+='\0';//cout<<Postfixexp;post2tree(p,Postfixexp);}void count(TNode *p,int &height,int n)//求值函数{//求树的高度if(p->left==NULL&&p->right==NULL){ if(n>height)height=n;}if(p->left!=NULL)count(p->left,height,n+1);if(p->right!=NULL)count(p->right,height,n+1);}void paint(TNode *p) //输出二叉树,以图的形式{int height=0;int h=0;int i;using std::queue;queue<TNode*> aQueue;count(p,height,1);TNode *pointer=p;TNode *lastpointer;if(pointer){ pointer->s=1;pointer->t=1;aQueue.push(pointer); }while(!aQueue.empty()){ lastpointer=pointer;pointer=aQueue.front();aQueue.pop();if(pointer->s>h){cout<<endl;h=pointer->s;}if(pointer->t==1){for(i=0;i<pow(2,height-pointer->s)-1;i++)cout<<" ";}else if(lastpointer->s!=pointer->s){for(i=0;i<(pointer->t-1)*(pow(2,height-pointer->s+1)-1)+(pointer->t-1)-1+pow(2,height-pointer->s );i++)cout<<" "; }else{ for(i=0;i<(pointer->t-lastpointer->t)*(pow(2,height-pointer->s+1)-1)+(pointer->t-lastpointer->t)-1 ;i++)cout<<" "; }cout<<pointer->oper;if(pointer->left!=NULL){ //输出左子树pointer->left->s=pointer->s+1;pointer->left->t=pointer->t*2-1;aQueue.push(pointer->left);}if(pointer->right!=NULL){pointer->right->s=pointer->s+1;pointer->right->t=pointer->t*2;aQueue.push(pointer->right);} } }int main() //主函数{string expression;TNode *tree;cout<<"------------function start-----------------"<<endl;cout<<"请输入表达式类型,前缀表达式输入-1,中缀表达式输入0,后缀表达式输入1."<<endl;int flag;cin>>flag;cout<<"请输入字符串表达式:"<<endl;cin>>expression;if(flag==-1)pre2tree(tree,expression); //判断表达式类型,并调用相应的函数,进行相应的计算else if(flag==1)post2tree(tree,expression);elsein2tree(tree,expression);paint(tree);cout<<endl;cout<<"中缀表达式为:";inOrder(tree);cout<<endl;cout<<"前缀表达式为:";preOrder(tree);cout<<endl;cout<<"后缀表达式为:";postOrder(tree);cout<<endl;freeTree(tree);cout<<endl;cout<<"----------function end-----------"<<endl; return 0;}。

相关文档
最新文档