二叉树存储与遍历实验报告
- 格式:doc
- 大小:45.00 KB
- 文档页数:6
课程实验报告题目:二叉树的遍历学生姓名: 何国焕学生学号: 631106040204专业班级: 11 级通信二班指导老师: 刘君完成日期: 2013.6.15一、实验要求:(1)定义:二叉树是树形结构,它的特点是每个结点至多有两棵子树,并且,二叉树的子树有左右之分,其次序不能任意颠倒。
(2)将建立好的树遍历输出,包括其前序遍历、中序遍历和后序遍历,同时统计树的深度并输出。
二、概要设计:(1)建立存储二叉树的结构体,其中包括树的结点及其左右孩子。
(2)建立二叉树,输入结点,空缺的左右孩子用‘#’代替,赋值为NULL,否则把输入的字符赋给该结点,并访问它的左右孩子。
(3)按照各遍历算法,创建遍历的函数,同时建立统计树深度的函数,在主函数中调用并用一定的语句对其进行输出。
三、详细设计:(1)建立存储二叉树的结构体,其中包括树的结点及其左右孩子,结点类型定义为char型,代码如下:typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;(2)建立二叉树,依次访问其结点和左右孩子,如果为‘#’则赋值为空,存储二叉树以待遍历:BiTree Create(BiTree T){char ch;ch=getchar();if(ch=='#')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))printf("Error!");T->data=ch;T->lchild=Create(T->lchild);T->rchild=Create(T->rchild);}return T;}(3)根据遍历的算法编写遍历函数,有前序、中序和后序,分别命名为PreOrderTraverse (前序)、InOrderTraverse(中序)和PostOrderTraverse(后序)。
二叉树的遍历实验报告二叉树的遍历实验报告引言:二叉树是一种常见的数据结构,它由节点和连接节点的边组成。
在实际应用中,我们经常需要对二叉树进行遍历,以便对其中的节点进行访问和操作。
本次实验旨在探索二叉树的遍历算法,并通过实验验证其正确性和效率。
一、二叉树的定义和基本操作二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
根据节点的访问顺序,二叉树的遍历可以分为前序遍历、中序遍历和后序遍历三种方式。
前序遍历是指先访问根节点,然后按照左子树、右子树的顺序递归地进行遍历;中序遍历是指先按照左子树、根节点、右子树的顺序递归地进行遍历;后序遍历是指先按照左子树、右子树、根节点的顺序递归地进行遍历。
二、实验设计和方法为了验证二叉树的遍历算法的正确性和效率,我们设计了以下实验方案:1. 构建二叉树:我们首先构建一个具有一定规模的二叉树,以模拟实际应用中的情况。
为了方便起见,我们选择随机生成一棵二叉树,并确保其结构合理。
2. 实现遍历算法:我们根据前文所述的遍历方式,实现了相应的遍历算法。
在实现过程中,我们考虑到了递归和迭代两种方式,并分别进行了实验比较。
3. 遍历实验:我们使用不同规模的二叉树进行遍历实验,并记录遍历的结果和所花费的时间。
通过对比不同规模下不同遍历方式的结果和时间,我们可以评估遍历算法的效率和准确性。
三、实验结果和分析在实验中,我们构建了一棵具有1000个节点的二叉树,并分别使用前序、中序和后序遍历算法进行遍历。
通过实验结果的比较,我们得出以下结论:1. 遍历结果的正确性:无论是前序、中序还是后序遍历,我们都能够正确地访问到二叉树中的每个节点。
这表明我们所实现的遍历算法是正确的。
2. 遍历算法的效率:在1000个节点的二叉树中,我们发现中序遍历算法的执行时间最短,后序遍历算法的执行时间最长,前序遍历算法的执行时间居中。
这是因为中序遍历算法在访问节点时可以尽可能地减少递归次数,而后序遍历算法需要递归到最深层才能返回。
数据结构二叉树遍历实验报告一、实验目的本次实验的主要目的是深入理解和掌握二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历,并通过实际编程实现来加深对这些遍历算法的理解和应用能力。
二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。
三、实验原理1、二叉树的定义二叉树是一种每个节点最多有两个子节点的树结构,分别称为左子节点和右子节点。
2、前序遍历前序遍历首先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。
3、中序遍历中序遍历首先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
4、后序遍历后序遍历首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。
四、实验步骤1、定义二叉树节点类```pythonclass TreeNode:def __init__(self, value):selfvalue = valueselfleft = Noneselfright = None```2、实现前序遍历函数```pythondef pre_order_traversal(root):if root is not None:print(rootvalue, end="")pre_order_traversal(rootleft)pre_order_traversal(rootright)```3、实现中序遍历函数```pythondef in_order_traversal(root):if root is not None:in_order_traversal(rootleft) print(rootvalue, end="")in_order_traversal(rootright)```4、实现后序遍历函数```pythondef post_order_traversal(root):if root is not None:post_order_traversal(rootleft) post_order_traversal(rootright) print(rootvalue, end="")```5、构建二叉树并进行遍历```python构建二叉树root = TreeNode(1) rootleft = TreeNode(2) rootright = TreeNode(3) rootleftleft = TreeNode(4) rootleftright = TreeNode(5)前序遍历print("前序遍历:")pre_order_traversal(root) print()中序遍历print("中序遍历:")in_order_traversal(root) print()后序遍历print("后序遍历:")post_order_traversal(root)print()```五、实验结果1、前序遍历结果:1 2 4 5 32、中序遍历结果:4 2 5 1 33、后序遍历结果:4 5 2 3 1六、结果分析1、前序遍历在前序遍历中,首先访问根节点,然后再访问左子树和右子树。
数据结构二叉树遍历实验报告数据结构二叉树遍历实验报告一、引言本文档旨在详细介绍二叉树遍历的实验过程和结果。
二叉树是一种在计算机科学领域常用的数据结构,通过遍历二叉树可以获取树中的所有节点数据。
本实验将分别介绍前序遍历、中序遍历和后序遍历这三种常见的遍历方法。
二、实验目的本实验的目的是通过实际操作,加深对二叉树遍历方法的理解,并验证这些遍历方法的正确性和效率。
三、实验环境本实验使用的环境如下:●操作系统: Windows 10●开发工具: Visual Studio Code●编程语言: C++四、实验步骤1.创建二叉树数据结构1.1 定义二叉树节点的结构,包含数据和左右子节点指针。
1.2 创建一个二叉树类,包含插入节点、删除节点、查找节点等方法。
1.3 使用已有的数据集构建二叉树,确保树的结构合理。
2.前序遍历前序遍历是先访问根节点,然后递归地遍历左子树和右子树。
2.1 以递归方式实现前序遍历。
2.2 以迭代方式实现前序遍历。
3.中序遍历中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。
3.1 以递归方式实现中序遍历。
3.2 以迭代方式实现中序遍历。
4.后序遍历后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。
4.1 以递归方式实现后序遍历。
4.2 以迭代方式实现后序遍历。
五、实验结果1.前序遍历结果:[节点1数据] [节点2数据] [节点4数据] [节点5数据] [节点3数据]2.中序遍历结果:[节点4数据] [节点2数据] [节点5数据] [节点1数据] [节点3数据]3.后序遍历结果:[节点4数据] [节点5数据] [节点2数据] [节点3数据] [节点1数据]六、实验分析通过实验结果可以看出,不同的遍历顺序得到的节点顺序也不同。
前序遍历先访问根节点,中序遍历先遍历左子树,后序遍历先遍历右子树。
根据需要,可以选择合适的遍历方法来处理二叉树的节点数据。
七、结论本实验验证了前序遍历、中序遍历和后序遍历的正确性,并且对比了它们的不同。
实验四二叉树运算与遍历实验报告学号-姓名实验时间 2010 年05月24日诚信声明本实验及实验报告所写内容为本人所做,没有抄袭。
实验题目与实验目的题目一:二叉树的遍历运算。
基本要求:在二叉树的二叉链表存储结构基础上,实现二叉树的以下运算:(1)创建二叉树的二叉树链表表示;(2)实现二叉树的先序遍历运算,输出先序遍历运算序列;(3)实现二叉树的中序遍历运算,输出中序遍历运算序列;(4)实现二叉树的后续遍历运算,输出后续遍历运算序列。
实验过程中遇到的主要问题1.根结点忘记申请内存;2.没有添加if(ch=='.')T=NULL;这个作为条件来创造一棵二叉树;3.遍历时没有弄清楚顺序,搞混了先序和中序的顺序。
实验小结1.对结构体的进一步的掌握;2.对递归算法的进一步认识与运用;3.对二叉树的理解由思想到代码实现;4.代码实现思想就是我们应该把问题循环化。
数据结构(自定义数据类型)typedef struct BiTnode{int date;struct BiTnode *lchild, *rchild;}BiTnode,*Bitree; //二叉树链式存储定义主要算法(或算法说明)int createbitree(Bitree &T){char ch;scanf("%c",&ch);if(ch=='.')T=NULL; //条件的判定else{ if(!(T=(Bitree)malloc(sizeof(BiTnode)))) return -1;T->date=ch;createbitree(T->lchild);createbitree(T->rchild);}return 0;} //建立一棵二叉树int preordertraverse(Bitree T){if(T==NULL)return -1;printf("%c",T->date);preordertraverse(T->lchild);preordertraverse(T->rchild);} //先序遍历。
二叉树的存储与遍历实验题目:二叉树的存储与递归遍历。
实验目的:掌握二叉树的定义、存储及遍历的算法及上机的基本操作。
实验内容与步骤:(1)树结构的基本操作,即操作者使用先序遍历的原理创建一个由多个节点组成的二叉树结构,并使用递归算法按先序、中序、后序对二叉树进行遍历。
(2)程序及部分注释如下:#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define OK 1#define ERROR 0#define OVERFLOW -1#define MAX(a,b) (a>b?a:b)typedef char TElemType;typedef int Status;//二叉树的二叉链表存储结构typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//先序遍历生成二叉树Status CreatBiTree(BiTree &T){TElemType ch,temp;printf("输入一个元素: ");scanf("%c",&ch);temp=getchar(); //结束回车if(ch==' ') T=NULL; //输入空格表示结点为空树else{if(!(T=(BiTree)malloc(sizeof(BiTNode))))exit(OVERFLOW);T->data=ch; //生成根结点CreatBiTree(T->lchild); //构造左子树CreatBiTree(T->rchild); //构造右子树}return OK;}//打印元素Status PrintElem(TElemType e){printf("%c ",e);return OK;}//先序遍历二叉树Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {if(T){ //二叉树不为空时if(Visit(T->data)) //访问根结点if(PreOrderTraverse(T->lchild,Visit)) //先序遍历左子树if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍历右子树return ERROR;}else return OK;}//中序遍历二叉树Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {if(T){if(InOrderTraverse(T->lchild,Visit))if(Visit(T->data))if(InOrderTraverse(T->rchild,Visit)) return OK;else return ERROR;}return OK;}//后序遍历二叉树Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){ if(T){if(PostOrderTraverse(T->lchild,Visit))if(PostOrderTraverse(T->rchild,Visit))if(Visit(T->data)) return OK;else return ERROR;}return OK;}void main(){BiTree T;Status (* Visit)(TElemType);Visit=PrintElem;CreatBiTree(T);printf("\n先序遍历:");PreOrderTraverse(T,Visit);printf("\n中序遍历:");InOrderTraverse(T,Visit);printf("\n后序遍历:");PostOrderTraverse(T,Visit);printf("\n程序结束.\n");}分析与体会:(1)本程序采用的是递归的算法实现了二叉树的三种遍历,相对于非递归的算法较为简单。
实习报告实习内容:二叉树遍历实习时间:2023实习单位:某高校计算机实验室一、实习目的本次实习的主要目的是通过实现二叉树的遍历,加深对二叉树数据结构的理解,掌握二叉树的常见操作,提高编程能力。
二、实习内容1. 理解二叉树的基本概念和性质,包括节点之间的关系、树的深度、高度等。
2. 掌握二叉树的存储结构,包括顺序存储和链式存储。
3. 实现二叉树的前序遍历、中序遍历和后序遍历。
4. 通过实际编程,验证二叉树遍历的正确性。
三、实习过程1. 二叉树的基本概念和性质:二叉树是一种非线性的数据结构,每个节点最多有两个子节点。
节点之间的关系包括父子关系、兄弟关系等。
树的深度是指从根节点到最远叶子节点的最长路径上的边数,高度是指从根节点到最远叶子节点的最长路径上的边数加1。
2. 二叉树的存储结构:二叉树可以用顺序存储结构或链式存储结构表示。
顺序存储结构使用数组来实现,每个节点存储在数组的一个位置中,节点之间的父子关系通过数组下标来表示。
链式存储结构使用链表来实现,每个节点包含数据域和两个指针域,分别指向左子节点和右子节点。
3. 二叉树的遍历:二叉树的遍历是指按照一定的顺序访问树中的所有节点。
常见的遍历方式有前序遍历、中序遍历和后序遍历。
前序遍历是指先访问根节点,然后递归遍历左子树,最后递归遍历右子树。
中序遍历是指先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
后序遍历是指先递归遍历左子树,然后递归遍历右子树,最后访问根节点。
4. 编程实现:根据二叉树的存储结构和遍历方法,编写C语言程序实现二叉树的前序遍历、中序遍历和后序遍历。
程序中使用递归函数来实现遍历操作,通过建立链式存储结构,验证遍历的正确性。
四、实习心得通过本次实习,我对二叉树的数据结构有了更深入的了解,掌握了二叉树的存储方式和常见操作。
在实现二叉树遍历的过程中,我学会了如何使用递归函数解决问题,提高了编程能力。
同时,通过实际编程验证了二叉树遍历的正确性,增强了对算法理解的信心。
二叉树的各种基本运算的实现实验报告
一、实验目的
实验目的为了深入学习二叉树的各种基本运算,通过操作实现二叉树的建立、存储、查找、删除、遍历等各种基本运算操作。
二、实验内容
1、构造一个二叉树。
我们首先用一定的节点来构建一棵二叉树,包括节点的左子节点和右子节点。
2、实现查找二叉树中的节点。
在查找二叉树中的节点时,我们根据二叉树的特点,从根节点开始查找,根据要查找的节点的值与根节点的值的大小的关系,来决定接下来查找的方向,直到找到要查找的节点为止。
3、实现删除二叉树中的节点。
在删除二叉树节点时,我们要做的是找到要删除节点的父节点,然后让父节点的链接指向要删除节点的子节点,有可能要删除节点有一个子节点,有可能有两个极点,有可能没有子节点,我们要根据每种情况进行处理,来保持二叉树的结构不变。
4、对二叉树进行遍历操作。
二叉树的遍历有多种方法,本实验使用的是先序遍历。
首先从根节点出发,根据先序遍历的顺序,先访问左子树,然后再访问右子树,最后访问根节点。
三、实验步骤
1、构建二叉树:
我们用一个数组代表要构建的二叉树,第一项为根节点,第二项和第三项是根节点的子节点。
二叉树的建立与遍历一、实验目的进一步理解二叉树的逻辑结构和存储结构,掌握二叉树的建立与遍历算法。
二、实验内容1、用二叉链表创建二叉树①输入根结点值;②若左子树不空,则输入左子树,否则输入一个结束符;③若右子树不空,则输入右子树,否则输入一个结束符。
例如:FCA▲▲DB▲▲▲E▲GH▲▲P▲▲其中▲表示结束符2、遍历该二叉树(1) 先序遍历(DLR)若二叉树为空,则结束返回。
否则:①访问根结点;②先序遍历左子树;③先序遍历右子树。
(2) 中序遍历(LDR)若二叉树为空,则结束返回。
否则:①中序遍历左子树;②访问根结点;③中序遍历左子树。
(3) 后序遍历(LRD)若二叉树为空,则结束返回。
否则:①后序遍历左子树;②后序遍历左子树;③访问根结点。
实验思想:根据要求,输入二叉树各结点对应的编号和数值,建立一棵空树,存储相应数值并使左子树和右子树均为空树,根据计算,若编号为偶数则为左子树,若为奇数则为右子树。
最后遍历二叉树。
三、实验算法流程图与程序清单(一)二叉树的建立与先序遍历:1、算法流程图:2、实验清单:{char data;struct node1 *lchild,*rchild;}BTCHINALR;BTCHINALR * createbt( ){ BTCHINALR *q;struct node1 *s[30];int j,i,x;printf("建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开\n\n");printf("i,x = ");scanf("%d,%c",&i,&x);while(i != 0 && x != '$'){q = (BTCHINALR*)malloc(sizeof(BTCHINALR));q->data = x; q->lchild = NULL; q->rchild = NULL;s[i] = q;if(i != 1){j = i / 2;if(i % 2 == 0) s[j]->lchild = q;else s[j]->rchild = q;}printf("i,x = ");scanf("%d,%c",&i,&x);}return s[1];}void inorder(BTCHINALR *bt){if(bt != NULL){ inorder(bt->lchild);printf("%c ",bt->data);inorder(bt->rchild); }}main( ){ BTCHINALR *bt;char ch;int i;bt = createbt(); i = 1;while(i) {printf("\n先序遍历二叉树(递归按y键,): ");fflush(stdin);scanf("%c",&ch);if(ch == 'y') inorder(bt);printf("\n");}3、实验结果:建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开i,x = 1,li,x = 2,ki,x = 3,yi,x = 4,bi,x =5,si,x = 7,ci,x =11,vi,x = 15,ri,x = 0,$先序遍历二叉树(递归按y键,): yl k b s v y c r(二)、二叉树的建立与中序遍历:1、算法流程图:2、实验清单:{char data;struct node1 *lchild,*rchild;}BTCHINALR;BTCHINALR * createbt( ){ BTCHINALR *q;struct node1 *s[30];int j,i,x;printf("建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开\n\n");printf("i,x = ");scanf("%d,%c",&i,&x);while(i != 0 && x != '$'){q = (BTCHINALR*)malloc(sizeof(BTCHINALR));q->data = x; q->lchild = NULL; q->rchild = NULL;s[i] = q;if(i != 1){j = i / 2;if(i % 2 == 0) s[j]->lchild = q;else s[j]->rchild = q;}printf("i,x = ");scanf("%d,%c",&i,&x);}return s[1];}void inorder(BTCHINALR *bt){if(bt != NULL){ inorder(bt->lchild);printf("%c ",bt->data);inorder(bt->rchild); }}main( ){ BTCHINALR *bt;char ch;int i;bt = createbt(); i = 1;while(i) {printf("\n先序遍历二叉树(递归按y键,): ");fflush(stdin);scanf("%c",&ch);if(ch == 'y') inorder(bt);printf("\n");}3、实验结果:建立二叉树,输入结点对应的编号和值,编号和值之间用逗号隔开i,x = 1,li,x = 2,ki,x = 3,yi,x = 4,bi,x =5,si,x = 7,ci,x =11,vi,x = 15,ri,x = 0,$先序遍历二叉树(递归按y键,): yl k b s v y c r四、实验心得体会通过这次实验,锻炼了自己编程的能力,加深了自己对有关知识的理解。
二叉树的遍历实验报告实验报告:二叉树的遍历(先序遍历、中序遍历、后序遍历)一、引言二叉树是一种非常常见的数据结构,在计算机领域有着广泛的应用。
对二叉树进行遍历操作是其中最基本的操作之一、本实验旨在通过对二叉树的先序遍历、中序遍历和后序遍历的实践,加深对二叉树遍历算法的理解和掌握。
二、目的1.掌握二叉树先序遍历的算法原理和实现方法;2.掌握二叉树中序遍历的算法原理和实现方法;3.掌握二叉树后序遍历的算法原理和实现方法;4.使用递归和非递归两种方式实现以上三种遍历算法;5.进行正确性验证和性能评估。
三、方法1.算法原理:1.1先序遍历:先访问根节点,然后递归遍历左子树,再递归遍历右子树;1.2中序遍历:先递归遍历左子树,然后访问根节点,最后递归遍历右子树;1.3后序遍历:先递归遍历左子树,再递归遍历右子树,最后访问根节点。
2.实现方法:2.1递归实现:采用函数递归调用的方式,实现对二叉树的遍历;2.2非递归实现:采用栈的数据结构,模拟递归的过程,实现对二叉树的遍历。
四、实验步骤1.数据结构设计:1.1定义二叉树的节点结构,包括节点值和两个指针(分别指向左子节点和右子节点);1.2定义一个栈结构,用于非递归实现时的辅助存储。
2.先序遍历:2.1递归实现:按照先序遍历的原理,通过递归调用遍历左子树和右子树,再输出根节点;2.2非递归实现:通过栈结构模拟递归的过程,先将根节点入栈,然后循环将栈顶节点弹出并输出,再将其右子节点入栈,最后将左子节点入栈,直到栈为空。
3.中序遍历:3.1递归实现:按照中序遍历的原理,通过递归调用先遍历左子树,再输出根节点,最后遍历右子树;3.2非递归实现:先将根节点入栈,然后循环将左子节点入栈,直到左子节点为空,然后弹出栈顶节点并输出,再将其右子节点入栈,重复以上过程直到栈为空。
4.后序遍历:4.1递归实现:按照后序遍历的原理,通过递归调用先遍历左子树,再遍历右子树,最后输出根节点;4.2非递归实现:通过栈结构模拟递归的过程,先将根节点入栈,然后重复以下步骤直到栈为空。
二叉树的存储与遍历
实验题目:二叉树的存储与递归遍历。
实验目的:掌握二叉树的定义、存储及遍历的算法及上机的基本操作。
实验内容与步骤:
(1)树结构的基本操作,即操作者使用先序遍历的原理创建一个由多个节点组成的二叉树结构,并使用递归算法按先序、中序、
后序对二叉树进行遍历。
(2)程序及部分注释如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define MAX(a,b) (a>b?a:b)
typedef char TElemType;
typedef int Status;
//二叉树的二叉链表存储结构
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历生成二叉树
Status CreatBiTree(BiTree &T)
{
TElemType ch,temp;
printf("输入一个元素: ");
scanf("%c",&ch);
temp=getchar(); //结束回车
if(ch==' ') T=NULL; //输入空格表示结点为空树
else
{
if(!(T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch; //生成根结点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
return OK;
}
//打印元素
Status PrintElem(TElemType e)
{
printf("%c ",e);
return OK;
}
//先序遍历二叉树
Status PreOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {
if(T){ //二叉树不为空时
if(Visit(T->data)) //访问根结点
if(PreOrderTraverse(T->lchild,Visit)) //先序遍历左子树
if(PreOrderTraverse(T->rchild,Visit)) return OK; //先序遍历右子树
return ERROR;}
else return OK;
}
//中序遍历二叉树
Status InOrderTraverse(BiTree T,Status (* Visit)(TElemType e)) {
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit)) return OK;
else return ERROR;}
return OK;
}
//后序遍历二叉树
Status PostOrderTraverse(BiTree T,Status (* Visit)(TElemType e)){ if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data)) return OK;
else return ERROR;
}
return OK;
}
void main()
{
BiTree T;
Status (* Visit)(TElemType);
Visit=PrintElem;
CreatBiTree(T);
printf("\n先序遍历:");
PreOrderTraverse(T,Visit);
printf("\n中序遍历:");
InOrderTraverse(T,Visit);
printf("\n后序遍历:");
PostOrderTraverse(T,Visit);
printf("\n程序结束.\n");
}
分析与体会:
(1)本程序采用的是递归的算法实现了二叉树的三种遍历,相对于非递归的算法较为简单。
但是也有一些缺点,例如数据录入的过程,是建立在用户首先熟练掌握先序遍历的原理的基础上。
在此我拿书上的一个例子来说明,如下图2-16:
在应用程序之前我首先简单说明一下先序遍历的原理(在录入数据时用到):先访问根节点,然后左子数,最后右子数。
当程序开始运行
时,会提示用户每次输入一个数据并以回车结束,以上图为例,录入数据依次为:‘1’,‘2’,‘4’,‘’,‘’,‘5’,‘6’,‘’,‘’,‘7’‘’,‘’,‘3’,‘’,‘’(注意:无数据时输入空格)程序执行后打印出:
先序遍历:1,2,4,5,6,7,3
中序遍历:4,2,6,5,7,1,3
后序遍历:4,6,7,5,2,3,1
程序结束
上述实验结果与书上的结果完全吻合,由此验证了实验的可行性。
(2)通过本实验我对二叉树的存储与遍历有了更深刻的理解,尤其是对复杂的递归思想也有了一定的了解。
在整个实验过程中我认为程序运行时数据的录入过程是个难题,这给予我一定的警示:开发应用程序时应该站在用户的角度看待问题,设计产品必须人性化等等。
经过了本次实验我觉得自己收获了不少宝贵的经验!
验指导教师(签名):实验成绩:。