1、重庆交通大学信息科学与工程学院综合性设计性实验报告班 级: 物联网 1501班 姓名 学号: 李怿欣 631507030101 实验项目名称: 树的遍历算法 实验项目性质: 综 合 性 实验所属课程: 算法与数据结构 实验室(中心): 语音楼 801信息实验室 指 导 教 师 : 盛明兰 实验完成时间: 2017 年 11 月 23 日一、 问题描述本实验要求对二叉树进行对每一个结点进行访问。树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次。二叉树的 3 种最重要的遍历方式分别称为前序遍历、中序遍历和后序遍历。以这 3 种方式遍历一
2、棵树时,若按访问结点的先后次序将结点排列起来,就可分别得到树中所有结点的前序列表,中序列表和后序列表。相应的结点次序分别称为结点的前序、中序和后序。二、 基本要求建立一棵二叉树,编写程序,对二叉树进行前、中、后序和层次进行遍历,给出算法,并打印结果,本程序用 VC6.0 编写,实现建立一棵二叉树的功能输入二叉树数据1 输入形式和输入值的范围:输入数据格式不限,具体定义为为 char 字符格式输入,并以嵌套表示法输入,以#字符结尾。2 输出的形式:输出二叉树的前序、中序、后序以及层次遍历结果。3 程序所能达到的功能:a) 输入二叉树的先序序列构造相应的二叉树;教师评阅意见:签名: 年 月 日实验
3、成绩:b) 前序递归遍历二叉树,输出得到的节点序列;c) 中序递归遍历二叉树,输出得到的节点序列;d) 后序递归遍历二叉树,输出得到的节点序列;e) 前序非递归遍历二叉树,输出得到的节点序列;f) 中序非递归遍历二叉树,输出得到的节点序列;g) 后序非递归遍历二叉树,输出得到的节点序列h) 层次遍历二叉树,输出得到的节点序列三、 测试数据本实验采用本人学号 631507030101 进行数据测试具体二叉树结构如下:在建立时以 createbtree(bt,“6(3(5(3(,0),0(,0),1(7(,1(1),0)#“)方法建立。761010305301四、 算法思想1) 建立二叉树结构建立
4、二叉树时要明确建立的树的结构,本实验以嵌套表示法进行建树,二叉树用链表存储来实现,因此要先定义一个二叉树链表存储结构。因此要先定义一个结构体。此结构体的每个结点都是由数据域 data、左指针域 Lchild、右指针域 Rchild 两个指针域分别指向该结点的左、右孩子,若某结点没有左孩子或者右孩子时,对应的指域就为空。最后,还需要一个链表的头指针指向根结点。第一步的时候一定要先定义一个结束标志符号,例如空格键、#等。当它遇到该标志时, 就指向为空。建立左右子树时,仍然是调用 createbtree ()函数,依此递归进行下去,直到遇到结束标志时停止操作。2) 输入二叉树元素输入二叉树时,是按上
5、面所确定的遍历规则输入的。最后,用一个返回值来表示所需要的。3) 先序遍历二叉树当二叉树为非空时,执行以下三个操作:访问根结点、遍历左子树、遍历右子树。4) 中序遍历二叉树当二叉树为非空时,程序执行以下三个操作:遍历左子树、访问根结点、遍历右子树。5) 后序遍历二叉树当二叉树为非空时,程序执行以下三个操作:遍历左子树、遍历右子树、访问根结点。6) 层次遍历二叉树当二叉树为非空时,程序执行以下三个操作:从根结点依次从上至下从左至右进行遍历。7) 主程序需列出各个函数,然后进行函数调用。五、 数据结构本实验数据以本人学号(631507030101)以 char 形式进行存储。六、 源程序#incl
6、ude#define maxsize 100typedef char elemtype;typedef struct binode/定义二叉树结点结构体,一装 data 域,两个指向左右孩子指针;elemtype data;binode *lchild,*rchild;bitree; void createbtree(bitree *bt=NULL;int top=-1,k,j=0;char ch;ch=strj;while(ch!=#) /判断是否是结尾;switch(ch) case (:top+;stacktop=p;/建立一个堆栈存储数据;k=1;break;case ):top-;b
7、reak;case ,:k=2;break;default:p=new binode;p-data=ch;p-lchild=p-rchild=NULL;/判断叶节点;if(bt=NULL)bt=p;elseswitch(k)case 1: stacktop-lchild=p;break;case 2: stacktop-rchild=p;break; j+;ch=strj;void printree(bitree *boot) /打印二叉树函数,传入二叉树根节点指针;bitree *b=boot;if(b!=NULL) coutdata;if(b-lchild!=NULL)|(b-rchild
8、!=NULL)/如果结点左右孩子非空;coutlchild);/指针指向左孩子;if (b-rchild!=NULL) coutrchild); /指针指向右孩子;coutdatalchild); Predigui(b-rchild); void Middigui(bitree *b) /递归中序遍历 if(b=NULL) return ; Middigui(b-lchild); coutdatarchild); void Lastdigui(bitree *b) /递归后序遍历 if(b=NULL) return ; Lastdigui(b-lchild); Lastdigui(b-rchi
9、ld); coutdatadatalchild; /指针指向左孩子;if(top!=-1) bt=stop-;bt=bt-rchild; /指针指向右孩子;void midtree(bitree *boot) /中序遍历函数,传入二叉树根节点指针;int top=-1;bitree *smaxsize,*bt=boot;while(bt!=NULL)|(top!=-1) while(bt!=NULL) s+top=bt;bt=bt-lchild; /指针指向左孩子;if(top-1) bt=stop-;coutdatarchild; /指针指向右孩子;void backtree(bitree
10、*boot) /后序遍历函数,传入二叉树根节点指针bitree *smaxsize,*pre=NULL,*bt=boot;int top=-1;while(bt!=NULL)|(top!=-1) /如果根节点非空或堆栈非空;while(bt!=NULL) s+top=bt;/存入堆栈,栈顶指针+;bt=bt-lchild; /指针指向左孩子;if(top-1) bt=stop;if(bt-rchild!=NULL /指针指向右孩子;elsecoutdatadatalchild!=NULL) srear=bt-lchild; /指针指向左孩子,把数据存入 a;rear=(rear+1)%maxs
11、ize;/循环队列尾指针加一;if(bt-rchild!=NULL) srear=bt-rchild; /指针指向右孩子,数据存入 a;rear=(rear+1)%maxsize; /循环队列尾指针加一;void main()/主函数bitree *bt;/定义一个二叉树根节点指针createbtree(bt,“6(3(5(3(,0),0(,0),1(7(,1(1),0)#“);/以学号为数据建树cout“嵌套表示法“endl; printree(bt);coutendl; cout“递归:“endl; cout“前序遍历:“;Predigui(bt);coutendl;cout“中序遍历:“
12、;Middigui(bt);coutendl;cout“后序遍历:“;Lastdigui(bt);coutendl;cout“非递归:“endl;cout“前序:“endl;pretree(bt);/前序打印二叉树coutendl;cout“中序:“endl;midtree(bt); /中序打印二叉树coutendl; cout“后序:“endl;backtree(bt); /后序打印二叉树coutendl; cout“层次:“endl;leveltree(bt); /层次打印二叉树coutendl; 七、 设计感想通过这次实验使我对二叉树的两种遍历格式和三种遍历方法有了进一步的了解,熟悉了二叉树的基本操作,掌握了二叉树的实现以及实际的应用,加深了对二叉树的理解,逐步培养解决实际问题的编程能力和如何使用递归方法和,使我跟深刻的认识到了二叉树的遍历,所谓二叉树的遍历,是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础,同时知道了如果知道了一棵树的先序遍历和中序遍历或者同时知道后序遍历和中序遍历,就能确定一棵二叉树,