实验四 二叉树的遍历和应用04

实验四  二叉树的遍历和应用04
实验四  二叉树的遍历和应用04

江南大学通信与控制工程学院标准实验报告

(实验)课程名称:计算机软件技术基础实验名称:二叉树的遍历和应用

班级:自动化

姓名:李玉书

学号:03

指导教师:卢先领

江南大学通信与控制学院

江南大学

实验报告

学生姓名:张晓蔚学号:0704090304

实验地点:信控机房实验时间:90分钟

一、实验室名称:信控学院计算中心

二、实验项目名称:二叉树的遍历和应用

三、实验学时:4学时

四、实验原理:

二叉树的遍历和应用

五、实验目的:

1、掌握二叉树的数据类型描述及特点。

2、掌握二叉树的存储结构(二叉链表)的建立算法。

3、掌握二叉链表上二叉树的基本运算的实现。

六、实验内容:

阅读后面的程序,并将其输入到计算机中,通过调试为下面的二叉树建立二叉链表,并用递归实现二叉树的先序、中序、后序三种遍历。

七、实验器材(设备、元器件):

计算机

八、实验步骤:

1、输入示例程序

2、构建按序插入函数实现算法

3、用C语言实现该算法

4、与源程序合并,编译,调试

5、测试,查错,修改

6、生成可执行文件,通过综合测试,完成实验

九、实验数据及结果分析:

测试用例

初始数据:ABDH,,I,,EJ,,K,,CFL,,,G,,

测试结果

十、实验结论:

该程序可以完成线性表的常规功能,且增加了异常处理,在异常情况下,例如:

表空,删除结点号不合法或出界,删除数值未找到等,这些情况下都能作出处理。可以通过边界测试。

十一对本实验过程及方法、手段的改进建议:

对书中程序的几点错误做了改正,见源程序。

附:源程序

#include

typedef struct bitree

{

char data ;

bitree *lchild;

bitree *rchild;

}bitree;

bitree *CreatBiTree()

{

bitree *T;

char ch ;//结点的data 域值

cin>>ch;

if(ch==',')T=NULL;

else {

T=new bitree;

T->data=ch;

T->lchild=CreatBiTree();

T->rchild=CreatBiTree();

}

return T;

}

//前序遍历

void preorder(bitree *root)

{

bitree *p;

p=root;

if(p!=NULL)

{

cout<data<<" ";

preorder(p->lchild);

preorder(p->rchild);

}

}

//中序遍历

void inorder (bitree *root)

{

bitree *p;

p=root;

if(p!=NULL)

{

inorder(p->lchild);

cout<data<<" ";

inorder(p->rchild);

}

}

//后序遍历

void postorder(bitree *root)

{

bitree *p;

p=root;

if(p!=NULL)

{

postorder(p->lchild);

postorder(p->rchild);

cout<data<<" ";

}

}

void main()

{

//以下为验证程序

bitree *root;

cout<<"建立一棵根为root"<

root=CreatBiTree();

cout<<"\n";

preorder(root);

cout<<"\n";

inorder(root);

cout<<"\n";

postorder(root);

cout<

} 报告评分:

指导教师签字:

二叉树遍历方法技巧

二叉树遍历方法 1.中序遍历的投影法 如果给定一棵二叉树的图形形态,是否能根据此图快速地得出其中序遍历的序列?回答是肯定的。具体做法是:首先按照二叉树的标准绘制二叉树形态,即将所有左子树都严格绘于根结点的左边;将所有右子树都严格绘于根结点的右边。然后假设现在有一个光源从该二叉树的顶部投射下来,那么所有结点在地平线上一定会有相应的投影,从左至右顺序读出投影结点的数据即为该二叉树的中序遍历序列。如图11.10所示。 图示的中序遍历序列: D J G B H E A F I C 2.先序遍历的填空法 如果给定一棵二叉树的图形形态,可在图形基础上,采用填空法迅速写出该二叉树的先序遍历序列。具体做法是:我们知道,对于每个结点都由三个要素组成,即根结点,左子树、右子树;又已知先序遍历顺序是先访问根结点、然后访问左子树、访问右子树。那么,我们按层分别展开,逐层填空即可得到该二叉树的先序遍历序列。 图11.10 中序遍历投影法示意图 如图11.10 中的二叉树采用填空法的步骤如下: (1)根结点左子树右子树 A( )( ) (2)A (根结点(左子树)(右子树))(根结点(左子树)(右子树)) A B C (3)A(B(根结点(左)(右))(根结点(左)(右)))(C(……)(……)) A B D 无 G E H 无 C F 无 (4)A B D G J E H C F I 此即为该二叉树的先序遍历序列。 注:后序遍历的序列亦可以此方法类推,请读者自己尝试。

3.利用遍历序列构造二叉树 如果已知一棵二叉树的先序遍历序列和中序遍历序列,则可以用这两个遍历序列构造一棵唯一的二叉树形态。我们知道任意一棵二叉树的先序遍历序列和中序遍历序列是唯一的,那么首先从给定的先序遍历序列入手,该先序序列的第一个元素一定是该二叉树的根;再分析这个根结点在中序遍历序列中的位置,中序遍历序列中根结点的左边即为左子树的全部元素,而根结点的右边即为右子树的全部元素;然后据此再将先序遍历序列除根结点以外的其余部分分为左、右子树两部分,并在这两部分中分别找出左、右子树的根结点。依此类推,即可得到完整的二叉树。例11.1 已知一棵二叉树的先序遍历和中序遍历序列分别为: 先序: A B C I D E F H G 中序: C I B E D A H F G 请构造这棵二叉树。 按前述分析,这棵二叉树的构造过程如图11.11所示 图11.11 二叉树的构造过程 树、森林与二叉树的转换(flash演示) 如前所述,树(或森林)的存储结构及其操作算法的实现,由于其“度”的不确定性而导致其存储结构不是较为复杂就是浪费空间,因而,定义在其存储结构上的算法也相应地较难兼顾全面。如果我们设定一定的规则,用二叉树来表示树和森林的话,就可以方便地解决树、森林的存储结构及其相关算法问题。 1.树、森林转换为二叉树 我们知道,一棵树中每个结点的孩子是无序的,而二叉树中各结点的孩子必须有左右之分。在此,为避免概念混淆,首先约定树中每个结点的孩子按从左至右的顺序升序编号,即将树中同一层上的兄弟分出大小。那么将一棵树转换成二叉树的方法是: (1)在树中同层兄弟间加一连线; (2)对树中每个结点仅保留其与长兄(左边第一个孩子)的连线,擦去其与其它孩子的连线; (3)以树(或子树)的根作为轴心,将所有的水平连线顺时针旋转45度,即可得到与该树完全等价的一棵二叉树。

实验三 二叉树的基本操作实现及其应用

二叉树的基本操作实现及其应用 一、实验目的 1.熟悉二叉树结点的结构和对二叉树的基本操作。 2.掌握对二叉树每一种操作的具体实现。 3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。 4.会用二叉树解决简单的实际问题。 二、实验内容 设计程序实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 1 按先序次序建立一个二叉树, 2按(A:先序 B:中序 C:后序)遍历输出二叉树的所有结点 以上比做,以下选做 3求二叉树中所有结点数 4求二叉树的深度 三、实验步骤 ㈠、数据结构与核心算法的设计描述 /* 定义DataType为char类型 */ typedef char DataType; /* 二叉树的结点类型 */ typedef struct BitNode { DataType data; struct BitNode *lchild,*rchild; }*BitTree; 相关函数声明: 1、/* 初始化二叉树,即把树根指针置空 */ void BinTreeInit(BitTree *BT) { BT=(BitTree)malloc(sizeof(BitNode)); BT->data=NULL; cout<<"二叉树初始化成功!"<>ch; if(ch=='#') BT=NULL; else { if(!(BT=(BitTree)malloc(sizeof(BitNode)))) exit(0);

数据结构二叉树实验报告

实验三二叉树的遍历 一、实验目的 1、熟悉二叉树的结点类型和二叉树的基本操作。 2、掌握二叉树的前序、中序和后序遍历的算法。 3、加深对二叉树的理解,逐步培养解决实际问题的编程能力。 二、实验环境 运行C或VC++的微机。 三、实验内容 1、依次输入元素值,以链表方式建立二叉树,并输出结点的值。 2、分别以前序、中序和后序遍历二叉树的方式输出结点内容。 四、设计思路 1. 对于这道题,我的设计思路是先做好各个分部函数,然后在主函数中进行顺序排列,以此完成实验要求 2.二叉树采用动态数组 3.二叉树运用9个函数,主要有主函数、构建空二叉树函数、建立二叉树函数、访问节点函数、销毁二叉树函数、先序函数、中序函数、后序函数、范例函数,关键在于访问节点 五、程序代码 #include #include #include #define OK 1 #define ERROR 0 typedef struct TNode//结构体定义 {

int data; //数据域 struct TNode *lchild,*rchild; // 指针域包括左右孩子指针 }TNode,*Tree; void CreateT(Tree *T)//创建二叉树按,依次输入二叉树中结点的值 { int a; scanf("%d",&a); if(a==00) // 结点的值为空 *T=NULL; else // 结点的值不为空 { *T=(Tree)malloc(sizeof(TNode)); if(!T) { printf("分配空间失败!!TAT"); exit(ERROR); } (*T)->data=a; CreateT(&((*T)->lchild)); // 递归调用函数,构造左子树 CreateT(&((*T)->rchild)); // 递归调用函数,构造右子树 } } void InitT(Tree *T)//构建空二叉树 { T=NULL; } void DestroyT(Tree *T)//销毁二叉树 { if(*T) // 二叉树非空 { DestroyT(&((*T)->lchild)); // 递归调用函数,销毁左子树 DestroyT(&((*T)->rchild)); // 递归调用函数,销毁右子树 free(T); T=NULL; } } void visit(int e)//访问结点 { printf("%d ",e); }

二叉树遍历所有代码

#include #include #include #include #include #define SIZE 100 using namespace std; typedef struct BiTNode //定义二叉树节点结构 { char data; //数据域 struct BiTNode *lchild,*rchild; //左右孩子指针域 }BiTNode,*BiTree; int visit(BiTree t); void CreateBiTree(BiTree &T); //生成一个二叉树 void PreOrder(BiTree); //递归先序遍历二叉树 void InOrder(BiTree); //递归中序遍历二叉树 void PostOrder(BiTree); //递归后序遍历二叉树 void InOrderTraverse(BiTree T); //非递归中序遍历二叉树 void PreOrder_Nonrecursive(BiTree T);//非递归先序遍历二叉树 void LeverTraverse(BiTree T);//非递归层序遍历二叉树 //主函数 void main() { BiTree T; char j; int flag=1; //---------------------程序解说----------------------- printf("本程序实现二叉树的操作。\n"); printf("叶子结点以空格表示。\n"); printf("可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。\n"); //---------------------------------------------------- printf("\n"); printf("请建立二叉树。\n"); printf("建树将以三个空格后回车结束。\n"); printf("例如:1 2 3 4 5 6 (回车)\n"); CreateBiTree(T); //初始化队列 getchar(); while(flag) {

数据结构实验二叉树

实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境 PC微机 DOS操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:*(+)3 正确结果: 2、输入数据:(1+2)*3+(5+6*7);

正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的 形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示:

二叉树遍历C语言(递归,非递归)六种算法

数据结构(双语) ——项目文档报告用两种方式实现表达式自动计算 专业: 班级: 指导教师: 姓名: 学号:

目录 一、设计思想 (01) 二、算法流程图 (02) 三、源代码 (04) 四、运行结果 (11) 五、遇到的问题及解决 (11) 六、心得体会 (12)

一、设计思想 二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的顺序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。根据不同的算法分,又分为递归遍历和非递归遍历。 递归算法: 1.先序遍历:先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子作为新的根结点重新进行上述判断,左子遍历结束后,再将右子作为根结点判断,直至结束。到达每一个结点时,打印该结点数据,即得先序遍历结果。 2.中序遍历:中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,直至结束。 3.后续遍历:指针到达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断完成后,将右子作为结点参数传入判断,打印右子。左右子判断完成后打印根结点。 非递归算法: 1.先序遍历:首先建立一个栈,当指针到达根结点时,打印根结点,判断根结点是否有左子和右子。有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若当前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若当前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若当前结点既没有左子也没有右子,则当前结点为叶子结点,此时将从栈中出栈一个元素,作为当前的根结点,打印结点元素,同时将当前结点同样按上述方法判断,依次进行。直至当前结点的左右子都为空,且栈为空时,遍历结束。 2.中序遍历:首先建立一个栈,定义一个常量flag(flag为0或者1),用flag记录结点的左子是否去过,没有去过为0,去过为1,默认为0.首先将指针指向根结点,将根结点入栈,然后将指针指向左子,左子作为新的结点,将新结点入栈,然后再将指针指向当前结点的左子,直至左子为空,则指针返回,flag置1,出栈一个元素,作为当前结点,打印该结点,然后判断flag,flag为1则将指针指向当前结点右子,将右子作为新的结点,结点入栈,再次进行上面的判断,直至当前结点右子也为空,则再出栈一个元素作为当前结点,一直到结束,使得当前结点右子为空,且栈空,遍历结束。 3.后续遍历:首先建立两个栈,然后定义两个常量。第一个为status,取值为0,1,2.0代表左右子都没有去过,1代表去过左子,2,代表左右子都去过,默认为0。第二个常量为flag,取值为0或者1,0代表进左栈,1代表进右栈。初始时指针指向根结点,判断根结点是否有左子,有左子则,将根结点入左栈,status置0,flag置0,若没有左子则判断结点有没有右子,有右子就把结点入右栈,status置0,flag置1,若左右子都没有,则打印该结点,并将指针指向空,此时判断flag,若flag为0,则从左栈出栈一个元素作为当前结点,重新判断;若flag为1则从右栈出栈一个元素作为当前结点,重新判断左右子是否去过,若status 为1,则判断该结点有没有右子,若有右子,则将该结点入右栈,status置1,flag置1,若没有右子,则打印当前结点,并将指针置空,然后再次判断flag。若当前结点status为2,且栈为空,则遍历结束。若指针指向了左子,则将左子作为当前结点,判断其左右子情况,按上述方法处理,直至遍历结束。

数据结构实验报告-二叉树的实现与遍历

《数据结构》第六次实验报告 学生姓名 学生班级 学生学号 指导老师

一、实验内容 1) 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序 以及按层次遍历的操作,求所有叶子及结点总数的操作。 2) 输出树的深度,最大元,最小元。 二、需求分析 遍历二叉树首先有三种方法,即先序遍历,中序遍历和后序遍历。 递归方法比较简单,首先获得结点指针如果指针不为空,且有左子,从左子递归到下一层,如果没有左子,从右子递归到下一层,如果指针为空,则结束一层递归调用。直到递归全部结束。 下面重点来讲述非递归方法: 首先介绍先序遍历: 先序遍历的顺序是根左右,也就是说先访问根结点然后访问其左子再然后访问其右子。具体算法实现如下:如果结点的指针不为空,结点指针入栈,输出相应结点的数据,同时指针指向其左子,如果结点的指针为空,表示左子树访问结束,栈顶结点指针出栈,指针指向其右子,对其右子树进行访问,如此循环,直至结点指针和栈均为空时,遍历结束。 再次介绍中序遍历: 中序遍历的顺序是左根右,中序遍历和先序遍历思想差不多,只是打印顺序稍有变化。具体实现算法如下:如果结点指针不为空,结点入栈,指针指向其左子,如果指针为空,表示左子树访问完成,则栈顶结点指针出栈,并输出相应结点的数据,同时指针指向其右子,对其右子树进行访问。如此循环直至结点指针和栈均为空,遍历结束。 最后介绍后序遍历: 后序遍历的顺序是左右根,后序遍历是比较难的一种,首先需要建立两个栈,一个用来存放结点的指针,另一个存放标志位,也是首先访问根结点,如果结点的指针不为空,根结点入栈,与之对应的标志位也随之入标志位栈,并赋值0,表示该结点的右子还没有访问,指针指向该结点的左子,如果结点指针为空,表示左子访问完成,父结点出栈,与之对应的标志位也随之出栈,如果相应的标志位值为0,表示右子树还没有访问,指针指向其右子,父结点再次入栈,与之对应的标志位也入栈,但要给标志位赋值为1,表示右子访问过。如果相应的标志位值为1,表示右子树已经访问完成,此时要输出相应结点的数据,同时将结点指针赋值为空,如此循环直至结点指针和栈均为空,遍历结束。 三、详细设计 源代码:

二叉树遍历课程设计】汇编

数据结构程序设计报告 学院: 班级: 学号: 姓名:

实验名称:二叉树的建立与遍历 一、实验目的: 1.掌握二叉树的二叉链表存储结构; 2.掌握二叉树创建方法; 3.掌握二叉树的先序、中序、后序的递归实现方法。 二、实验内容和要求: 创建二叉树,分别对该二叉树进行先序、中序、后序遍历,并输出遍历结果。 三、叉树的建立与遍历代码如下: #include #include struct tnode//结点结构体 { char data; struct tnode *lchild,*rchild; }; typedef struct tnode TNODE; TNODE *creat(void) { TNODE *root,*p; TNODE *queue[50];

int front=0,rear=-1,counter=0;//初始队列中需要的变量front、rear和计数器counter char ch; printf("建立二叉树,请输入结点:(#表示虚节点,!表示结束)\n"); ch=getchar(); while(ch!='!') { if(ch!='#') { p=(TNODE *)malloc(sizeof(TNODE)); p->data=ch; p->lchild=NULL; p->rchild=NULL; rear++; queue[rear]=p;//把非#的元素入队 if(rear==0)//如果是第一个元素,则作为根节点 { root=p; counter++; } else { if(counter%2==1)//奇数时与其双亲的左子树连接 { queue[front]->lchild=p; } if(counter%2==0)//偶数时与其双亲的右子树连接 { queue[front]->rchild=p;

数据结构实验六二叉树操作代码实现

#include using namespace std; #define MAXLEN 20 //最大长度 int num; typedef char DATA;//定义元素类型 struct CBTType// 定义二叉树结点类型 { DATA data;//元素数据 CBTType * left;//左子树结点指针 CBTType * right;//右子树结点指针 int leftSize = 0; }; /*********************初始化二叉树***********************/ CBTType *InitTree() { CBTType * node; if (node = new CBTType)//申请内存 { num++; cout << "请先输入一个根节点数据:" << endl; cin >> node->data; node->left = NULL; node->right = NULL; if (node != NULL)//如果二叉树结点不为空 { return node; } else { return NULL; } } return NULL; } /***********************查找结点*************************/ CBTType *TreeFindNode(CBTType *treeNode, DATA data) { CBTType *ptr; if (treeNode == NULL) { return NULL; } else {

if (treeNode->data == data) { return treeNode; } else//分别向左右子树查找 { if (ptr = TreeFindNode(treeNode->left, data))//左子树递归查找 { return ptr; } else if (ptr = TreeFindNode(treeNode->right, data))//右子树递归查找 { return ptr; } else { return NULL; } } } } /**********************添加结点*************************/ void AddTreeNode(CBTType *treeNode) { CBTType *pnode, *parent; DATA data; char menusel; if (pnode = new CBTType) //分配内存 { cout << "输入添加的二叉树结点数据:" << endl; cin >> pnode->data; pnode->left = NULL; //设置左子树为空 pnode->right = NULL; //设置左子树为空 cout << "输入该结点的父结点数据:" << endl; cin >> data; parent = TreeFindNode(treeNode, data); //查找父结点,获得结点指针 if (!parent) //没找到 { cout << "没有找到父结点!" << endl; delete pnode; return; } cout << "**********************" << endl;

二叉树及其应用(实验五)

实验五二叉树及其应用 1.目的要求: (1)通过实验掌握二叉树的两种基本的存储结构,及二叉树的建立、遍历,并加以应用。 (2)Huffman树建立、编码。 2.实验内容: (1)按先序次序输入二叉树中结点的值,建立一棵以二叉链表作存储结构的二叉树,然后按先序、中序、后序顺序分别遍历这棵二叉树,并完成二叉树的相应信息 的统计(如各种结点数目、二叉树的高度等); (2)建立一棵二叉排序树,并对其进行先序、中序、后序遍历。 (3)应用队列结构实现二叉树的层次遍历。 (4)设计一个完整的编码系统:针对一篇文档,统计各个字符的出现次数,并为其设计Huffman编码。 注:(1)~(2)必做,(3)~(4)选做。 三.实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页) (1)按先序次序输入二叉树中结点的值,建立一棵以二叉链表作存储结构的二叉树,然后按先序、中序、后序顺序分别遍历这棵二叉树,并完成二叉树的相应信息 的统计(如各种结点数目、二叉树的高度等); 程序代码: 头文件: #ifndef _H_ #define _H_ #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType e; struct BiTNode *LChild,*RChild; }BiTNode,*BiTree; Status Create(BiTree &T);

Status PrintElemType(TElemType e); Status PreOrderTraver(BiTree T,Status (* visit)(TElemType e)); Status InOrderTraver(BiTree T,Status (* visit)(TElemType e)); Status PostOrderTraver(BiTree T,Status (* visit)(TElemType e)); Status Count(BiTree T); Status Countleaf(BiTree T); Status Counttwo(int n); Status Countone(int n,int n0,int n2); Status Depth(BiTree T); #endif 主函数: #include #include #include"1.h" int main() { BiTree T; printf("请按照先序输入树值:\n"); if(!Create(T)) printf("存储空间分配失败\n"); printf("先序遍历该树为:\n"); if(!PreOrderTraver(T,PrintElemType)) printf("打印函数出错\n"); printf("\n"); printf("中序遍历该树为:\n"); if(!InOrderTraver(T,PrintElemType)) printf("打印函数出错\n"); printf("\n"); printf("后序遍历该树为:\n"); if(!PostOrderTraver(T,PrintElemType)) printf("打印函数出错\n"); printf("\n"); printf("总结点数有:%d\n",Count(T)); printf("其中叶子结点数有:%d\n",Countleaf(T)); printf("其中一度结点数有:%d\n",Countone(Count(T),Countleaf(T),Counttwo(Countleaf(T)))); printf("其中二度结点数有:%d\n",Counttwo(Countleaf(T))); printf("该二叉树的深度为:%d\n",Depth(T)); return 0; } 功能函数: #include #include #include"1.h"

数据结构实验-二叉树的操作

******************************* 实验题目:二叉树的操作 实验者信息:班级13007102,姓名庞文正,学号1300710226 实验完成的时间3:00 ****************************** 一、实验目的 1,掌握二叉树链表的结构和二叉树的建立过程。 2,掌握队列的先进先出的运算原则在解决实际问题中的应用。 3,进一步掌握指针变量、指针数组、动态变量的含义。 4,掌握递归程序设计的特点和编程方法。 二、实验内容 已知以二叉链表作存储结构,试编写按层次遍历二叉树的算法。(所谓层次遍历,是指从二叉树的根结点开始从上到下逐层遍历二叉树,在同一层次中从左到右依次访问各个节点。)调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。加深对算法的理解。 三、算法设计与编码 1.本实验用到的理论知识 总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。 本算法要采用一个循环队列que,先将二叉树根结点入队列,然后退队列,输出该结点;若它有左子树,便将左子树根结点入队列;若它有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉的目的。2.算法概要设计 给出实验的数据结构描述,程序模块、功能及调用关系 #include #include #define M 100 typedef struct node //二叉链表节点结构 {int data; //数据域 struct node *lchild,*rchild; //左孩子右孩子链 }bitree; bitree *que[M]; //定义一个指针数组,说明队列中的元素bitree 指针类型 int front=0, rear=0; //初始化循环列队 bitree *creat() //建立二叉树的递归算法 {bitree *t; int x; scanf("%d",&x); if(x==0) t=NULL; //以x=0 表示输入结束 else {t=malloc(sizeof(bitree)); //动态生成节点t,分别给节点t 的数据域,t->data=x; //左右孩子域赋值,给左右孩子赋值时用到 t->lchild=creat(); // 了递归思想 t->rchild=creat(); }

二叉树的基本操作实验

实验三二叉树的基本运算 一、实验目的 1、使学生熟练掌握二叉树的逻辑结构和存储结构。 2、熟练掌握二叉树的各种遍历算法。 二、实验内容 [问题描述] 建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目/叶结点数目;(选做) 4. 将二叉树每个结点的左右子树交换位置。(选做) [基本要求] 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立), [测试数据] 如输入:ABCффDEфGффFффф(其中ф表示空格字符) 则输出结果为 先序:ABCDEGF 中序:CBEGDFA 后序:CGEFDBA 层序:ABCDEFG [选作内容] 采用非递归算法实现二叉树遍历。 三、实验前的准备工作 1、掌握树的逻辑结构。 2、掌握二叉树的逻辑结构和存储结构。 3、掌握二叉树的各种遍历算法的实现。 一实验分析 本次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历。二叉树的遍历有多种方法,本次试验我采用递归法,递归法比较简单。 二概要设计 功能实现

1.int CreatBiTree(BiTree &T) 用递归的方法先序建立二叉树, 并用链表储存该二叉树 2.int PreTravel(BiTree &T) 前序遍历 3. int MidTravel(BiTree &T) 中序遍历 4.int PostTravel(BiTree &T) 后序遍历 5.int Depth(BiTree &T) //计算树的深度 6.int howmuch(BiTree T,int h) 采用树节点指针数组,用于存放遍历到的元素地址,如果有左孩子,存入地址,j加一,否则没操作,通过访问数组输出层次遍历的结果。k计算叶子数,j为总节点。 7. int exchang(BiTree &T) 交换左右子树,利用递归,当有左右孩子时才交换 三详细设计 #include #include typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

实验5 二叉树建立及应用

实验五二叉树建立及应用 一、实验目的 1.熟悉二叉树的存贮结构及遍历方式,掌握有关算法的实现。 2.能够利用二叉树解决具体问题。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; ⒉软件:DOS或Windows操作系统+Turbo C; 三、实验要求 ⒈要求采用二叉链表作为存贮结构,完成二叉树的建立、先序、中序、和后序遍历的 操作。 ⒉输入数据:树中每个结点的数据类型设定为字符型。 3.设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序遍历,求该二叉树所有叶子结点总数。 四、实验内容 附:参考程序为类C语言程序,非标准C语言程序,需要进行相应的修改。 二叉链表结构如下:P134 typedef struct lnode {char data; struct lnode *lchild,*rchild; }lnode,*tree;

1.建树子函数P137 status creat(tree &t) {//按先序次序输入二叉树中结点的值,’.’字符表示空树 scanf(&ch); if(ch=='.') t=null; else {t=(tree)malloc(sizeof(lnode)); t->data=ch; creat(t->lchild); creat(t->rchild);} return ok; } 2.先序遍历子函数P136 preorder(tree t) { if(t!=null) {printf(t->data); preorder(t->lchild); preorder(t->rchild); } } 3.后序遍历子函数P136 postorder(tree t) {if(t!=null) {postorder(t->lchild); postorder(t->rchild); printf(t->data); } } 五、思考题 1. 已知二叉树先序和中序序列,唯一地构造一棵二叉树并且验证其正确性。 2. 建立一个二叉树,并且按层次遍历操作。 六、报告要求 1.报告要求用专门的实验报告纸书写,字迹清晰,格式规范。 2.报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验要求。

数据结构实验报告之树与二叉树

学生实验报告 学院:软通学院 课程名称:数据结构与算法 专业班级:软件142 班 姓名:邹洁蒙 学号: 0143990

学生实验报告 (二) 一、实验综述 1、实验目的及要求 目的:1)掌握树与二叉树的基本概念; 2)掌握二叉树的顺序存储,二叉链表的先序遍历中序遍历和后序遍历算法; 3)掌握树的双亲表示法。 要求:1)编程:二叉树的顺序存储实现; 2)编程:二叉链表的先序遍历中序遍历和后序遍历实现; 3)编程:树的双亲表示法实现。 2、实验仪器、设备或软件 设备:PC 软件:VC6 二、实验过程(编程,调试,运行;请写上源码,要求要有注释) 1.编程:二叉树的顺序存储实现 代码: BiTree::BiTree()//建立存储空间 { data = new int[MAXSIZE]; count = 0; } void BiTree::AddNode(int e)//加结点 { int temp = 0; data[count] = e; count++;//从编号0开始保存 }

运行截图: 2.编程:二叉链表的先序遍历中序遍历和后序遍历实现代码: void InOrderTraverse(BiTree* Head)//中序遍历 { if (Head) { InOrderTraverse(Head->LeftChild); cout << Head->data<<" "; InOrderTraverse(Head->RightChild); } } void PreOrderTraverse(BiTree* Head)//先序遍历 { if (Head) { cout << Head->data << " "; PreOrderTraverse(Head->LeftChild); PreOrderTraverse(Head->RightChild); } } void PostOrderTraverse(BiTree* Head)//后序遍历 { if (Head) { PostOrderTraverse(Head->LeftChild); PostOrderTraverse(Head->RightChild); cout << Head->data << " "; } } 运行截图:

基于二叉树遍历系统设计与实现

长春建筑学院《数据结构》课程设计(论文) 基于二叉树遍历系统设计与实现Binary tree traversal System Design and Implementation 年级: 学号: 姓名: 专业: 指导老师: 二零一三年十二月

摘要 针对现实世界中许多关系复杂的数据,如人类社会的家谱,各种社会组织机构,博弈交通等复杂事物或过程以及客观世界中广泛存在的具有分支关系或层次特性的对象.如操作系统的文件构成、人工智能和算法分析的模型表示以及数据库系统的信息组织形式等,用线性结构难以把其中的逻辑关系表达出来,必须借助于数和图这样的非线性结构,因此在以模拟客观世界问题,解决客观世界问题为主要任务的计算机领域中树型结构是信息的一种重要组织形式,树有着广泛应用。在树型结构的应用中又以二叉树最为常用。 二叉树是一种非常重要的非线性结构,所描述的数据有明显的层次关系,其中的每个元素只有一个前驱,二叉树是最为常用的数据结构,它的实际应用非常广泛,二叉树的遍历方式有三种,前序遍历,中序遍历,后序遍历,先序遍历的顺序为:NLR 先根结点,然后左子树,右子树;中序遍历顺序为;LNR先左子树,然后根结点,右子树;后序遍历顺序为:LRN先左子树,然后右子树,根结点。由前序和中序遍历,有中序和后序遍历序列可以唯一确定一棵二叉树。 对于给几个数据的排序或在已知的几个数据中进行查找,二叉树均能提供一种十分有效的方法,比如在查找问题上,任何借助于比较法查找长度为Ⅳ的一个序表的算法,都可以表示成一株二叉树。反之,任何二叉树都对应一个查找有序表的有效方法根据树的数学理论,对于算法分析的某些最有启发性的应用,是与给出用于计算各种类型中不同树的数目的公式有关的。 本文对二叉树以及二叉树的各种功能做介绍以及写出一些基本的程序,让读者对二叉树的理解有更好的效果。 关键词:二叉树;左子树;右子树

实验五--二叉树的存储结构和基本操作

实验五二叉树的存储表示和基本操作 实验内容 1. 二叉树的二叉链表的存储结构 —————二叉树的二叉链表存储表示———————— typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; 2. 二叉树的基本操作 (1)创建操作:创建一棵二叉树。 (2)查找操作:查找二叉树中值为x的结点。 (3)查找左孩子操作:查找二叉树中值为x的结点的左孩子。 (4)查找右孩子操作:查找二叉树中值为x的结点的右孩子。 (5)求深度操作:求二叉树的深度。 (6)求宽度操作:求二叉树的宽度。 (7)求结点个数操作:求二叉树的结点个数。 (8)求叶子结点个数操作:求二叉树的叶子结点个数。 (9)输出操作:以括号表示法输出二叉树。 3. 链式队列操作实现的步骤 (1)实现将链式队列的存储结构和基本操作程序代码。 (2)实现main主函数。 4.程序代码完整清单 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; /*数据元素*/ struct node *lchild; /*指向左孩子*/ struct node *rchild; /*指向右孩子*/ } BTNode; //基本操作函数声明 void CreateBTNode(BTNode *&b,char *str); /*创建一棵二叉树*/ BTNode *FindNode(BTNode *b,ElemType x); /*查找二叉树的结点*/ BTNode *LchildNode(BTNode *p); /*查找二叉树结点的左孩子*/ BTNode *RchildNode(BTNode *p); /*查找二叉树结点的右孩子*/ int BTNodeDepth(BTNode *b); /*求二叉树的深度*/

数据结构实验报告—二叉树

算法与数据结构》课程实验报告

一、实验目的 1、实现二叉树的存储结构 2、熟悉二叉树基本术语的含义 3、掌握二叉树相关操作的具体实现方法 二、实验内容及要求 1. 建立二叉树 2. 计算结点所在的层次 3. 统计结点数量和叶结点数量 4. 计算二叉树的高度 5. 计算结点的度 6. 找结点的双亲和子女 7. 二叉树前序、中序、后序遍历的递归实现和非递归实现及层次遍历 8. 二叉树的复制 9. 二叉树的输出等 三、系统分析 (1)数据方面:该二叉树数据元素采用字符char 型,并且约定“ #”作为二叉树输入结束标识符。并在此基础上进行二叉树相关操作。 (2)功能方面:能够实现二叉树的一些基本操作,主要包括: 1. 采用广义表建立二叉树。 2. 计算二叉树高度、统计结点数量、叶节点数量、计算每个结点的度、结点所在层次。 3. 判断结点是否存在二叉树中。 4. 寻找结点父结点、子女结点。 5. 递归、非递归两种方式输出二叉树前序、中序、后序遍历。 6. 进行二叉树的复制。 四、系统设计 (1)设计的主要思路 二叉树是的结点是一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树、互不相交的二叉树组成。根据实验要求,以及课上老师对于二叉树存储结构、基本应用的讲解,同时课后研究书中涉及二叉树代码完成二叉树模板类,并将所需实现各个功能代码编写完成,在建立菜单对功能进行调试。 (2)数据结构的设计 二叉树的存储结构有数组方式和链表方式。但用数组来存储二叉树有可能会消耗大量的存储空间,故在此选用链表存储,提高存储空间的利用率。根据二叉树的定义,二叉

相关文档
最新文档