数据结构课程设计(先中后序遍历)_第1页
数据结构课程设计(先中后序遍历)_第2页
数据结构课程设计(先中后序遍历)_第3页
数据结构课程设计(先中后序遍历)_第4页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安徽工程大学数据结构课程设计说明书学生姓名:刘超学 号:3120702109学院 :计算机与信息学院专业 :信息与计算科学题目 :二叉树的创建和遍历指导教师潘海玉2014年 8月 25日.目录1. 需求分析2. 概要设计3. 详细设计4. 调试分析5. 课程总结6. 附录 -11391012.1. 需求分析问题描述:根据运行时输入的先序序列,创建一棵二叉树, 分别对其进行先序、中序、后序、层序遍历,并显示遍历结果。void CreateBTree(BTree &T)/按先序次序输入,构造二叉树void PreOrder(BTree T)/递归先序遍历void InOrder(BTree

2、 T)/递归中序遍历void PostOrder(BTree T)/递归后序遍历void LevelOrder(BTree T)/层序遍历void NRPreOrder(BTree bt)/非递归先序遍历void NRInOrder(BTree bt)/非递归中序遍历void NRPostOrder(BTree bt)/非递归后序遍历void main()/二叉树的建立与遍历实现2. 概要设计此次课程设计遍历算法的框架图遍历算法非递归遍递归遍历历层序遍历先序遍历中序遍历后序遍历先序遍历中序遍历后序遍历.此次课程设计所用的三组二叉树AABCBCDEFDEFGHABFCGDEH本设计所使用的存储结

3、构:typedef char ElemType;/定义二叉树结点值的类型为字符型typedef struct bnode/二叉链表结构定义ElemType data;struct bnode *lchild,*rchild;Bnode,* BTree;typedef struct BTree ptr;int tag;.stacknode;3. 详细设计void CreateBTree(BTree &T)/按先序次序输入,构造二叉链表表示的二叉树T,#表示空树char ch;ch=getchar();if(ch='#') T=NULL;/读入 #时,将相应节点指针置空el

4、seif(!(T=(Bnode *)malloc(sizeof(Bnode)printf("创建失败 !");/生成结点空间T->data=ch;CreateBTree(T->lchild);/构造二叉树的左子树CreateBTree(T->rchild);/构造二叉树的右子树void PreOrder(BTree T)/递归先序遍历if(T)printf("%c ",T->data);PreOrder(T->lchild);PreOrder(T->rchild);.void InOrder(BTree T)/递归中序

5、遍历if(T)InOrder(T->lchild);printf("%c ",T->data);InOrder(T->rchild);void PostOrder(BTree T)/递归后序遍历if(T)PostOrder(T->lchild);PostOrder(T->rchild);printf("%c ",T->data);void LevelOrder(BTree T)/层序遍历BTree QMAX;int front=0,rear=0;.BTree p;if(T) /根结点入队Qrear=T;rear=(re

6、ar+1)%MAX;while(front!=rear)p=Qfront;/队头元素出队front=(front+1)%MAX;printf("%c ",p->data);if(p->lchild) /左孩子不为空,入队Qrear=p->lchild;rear=(rear+1)%MAX;if(p->rchild) /右孩子不为空,入队Qrear=p->rchild;rear=(rear+1)%MAX;void NRPreOrder(BTree bt)/ 非递归先序遍历 BTree stackMAX,p;.int top;if (bt!=NULL

7、)top=0;p=bt;while(p!=NULL|top>0)while(p!=NULL)printf("%c",p->data);stacktop=p;/预留 p 指针在数组中top+;p=p->lchild;if (top>0)top-;p=stacktop;p=p->rchild;/*左子树为空,进右子树*/void NRInOrder(BTree bt)/ 非递归中序遍历 BTree stackMAX,p;.int top;if (bt!=NULL)top=0;p=bt;while(p!=NULL|top>0)while(p!=

8、NULL)stacktop=p; /预留 p 指针在数组中top+;p=p->lchild;if (top>0)top-;p=stacktop;printf("%c",p->data);p=p->rchild;/*左子树为空,进右子树*/void NRPostOrder(BTree bt)/ 非递归后序遍历 stacknode sMAX,x;.BTree p=bt;int top;if(bt!=NULL)top=0;p=bt;dowhile (p!=NULL)/遍历左子树stop.ptr = p;stop.tag = 1;/标记为左子树top+;p=

9、p->lchild;while (top>0 && stop-1.tag=2)x = s-top;p = x.ptr;printf("%c",p->data); /tag为 R,表示右子树访问完毕,故访问根结点if (top>0)stop-1.tag =2;/遍历右子树p=stop-1.ptr->rchild;.while (top>0);4. 调试分析一组测试树运行时界面.5. 课程总结.这个程序的代码较为简单, 可以实现了二叉树的三种递归遍历算法和三种非递归遍历算法还有层序遍历算法, 想要改进的话可以在选择功能上下手,

10、 建立的时候提示更人性化, 对输入的数据进行有效性验证,也可以改进为对遍历算法进行选择等等。二叉树这个数据结构几乎在每一本的数据结构的书都作为重点内容讲述,足见其在算法和程序设计界的重要地位。但是,到目前为止, 自己还没有真正体验到它的威力,可能是学习的还不够深刻。 像二叉树遍历的算法,用递归的算法只是简单的几行代码,然后就可以实现输出遍历次序。对于非递归的思想, 要用到栈这个数据结构, 但是对于二叉树遍历问题来说非递归要较递归复杂。程序一开始总是出现语法错误, 改了很多次也上网查了相关资料,才最后改为现在可以成功运行的程序。 在这个过程中, 我体会到开发工程师的感觉了, 就是要用挑剔的眼光想

11、问题并且不断地改进自己的程序。通过这次课程设计逐渐提高了自己的程序设计和调试能力,通过上机实习, 严整自己设计算法的正确性, 学会了有效利用基本调试方法, 查找出代码中的错误并且修改。 我会继续我的兴趣编写程序的, 相信在越来越多的尝试之后, 自己会不断进步和提高。.6. 附录#include <stdlib.h>#include <stdio.h>#include<iostream.h>#define MAX 10 /结点个数不超过10 个typedef char ElemType;/定义二叉树结点值的类型为字符型typedef struct bnode/

12、二叉链表结构定义ElemType data;struct bnode *lchild,*rchild;Bnode,* BTree;void CreateBTree(BTree &T)/按先序次序输入,构造二叉链表表示的二叉树 T,#表示空树char ch;ch=getchar();if(ch='#') T=NULL;/读入 #时,将相应节点指针置空elseif(!(T=(Bnode*)malloc(sizeof(Bnode)printf("创建失败 !");/生成结点空间T->data=ch;CreateBTree(T->lchild);

13、/构造二叉树的左子树.CreateBTree(T->rchild);/构造二叉树的右子树void PreOrder(BTree T)/递归先序遍历if(T)printf("%c ",T->data);PreOrder(T->lchild);PreOrder(T->rchild);void InOrder(BTree T)/递归中序遍历if(T)InOrder(T->lchild);printf("%c ",T->data);InOrder(T->rchild);void PostOrder(BTree T)/ 递

14、归后序遍历 if(T).PostOrder(T->lchild);PostOrder(T->rchild);printf("%c ",T->data);void LevelOrder(BTree T)/层序遍历BTree QMAX;int front=0,rear=0;BTree p;if(T) /根结点入队Qrear=T;rear=(rear+1)%MAX;while(front!=rear)p=Qfront;/队头元素出队front=(front+1)%MAX;printf("%c ",p->data);if(p->lc

15、hild) /左孩子不为空,入队Qrear=p->lchild;rear=(rear+1)%MAX;.if(p->rchild) /右孩子不为空,入队Qrear=p->rchild;rear=(rear+1)%MAX;void NRPreOrder(BTree bt)/非递归先序遍历BTree stackMAX,p;int top;if (bt!=NULL)top=0;p=bt;while(p!=NULL|top>0)while(p!=NULL)printf("%c",p->data);stacktop=p;/预留 p 指针在数组中top+;p

16、=p->lchild;if (top>0)top-;.p=stacktop;p=p->rchild;/*左子树为空,进右子树*/void NRInOrder(BTree bt)/非递归中序遍历BTree stackMAX,p;int top;if (bt!=NULL)top=0;p=bt;while(p!=NULL|top>0)while(p!=NULL)stacktop=p; /预留 p 指针在数组中top+;p=p->lchild;if (top>0)top-;p=stacktop;.printf("%c",p->data);p

17、=p->rchild;/*左子树为空,进右子树*/typedef struct BTree ptr;int tag;stacknode;void NRPostOrder(BTree bt)/非递归后序遍历stacknode sMAX,x;BTree p=bt;int top;if(bt!=NULL)top=0;p=bt;dowhile (p!=NULL)/遍历左子树stop.ptr = p;.stop.tag = 1;/标记为左子树top+;p=p->lchild;while (top>0 && stop-1.tag=2)x = s-top;p = x.ptr

18、;printf("%c",p->data);/tag为 R,表示右子树访问完毕,故访问根结点if (top>0)stop-1.tag =2;/遍历右子树p=stop-1.ptr->rchild;while (top>0);void main()/主函数BTree T;T=NULL;int select;.while(1)printf("nnn请选择要执行的操作 :n");printf("1.创建二叉树 n");printf("2.二叉树的递归遍历算法(前、中、后)n");printf("3.二叉树的层次遍历算法n");printf("4.二叉树的非递归遍历算法(前、中、后)n");printf("0.退出 n");printf("输入: ");cin>>select;switch(select)case 0:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论