数据结构课程设计(二叉树的基本操作)资料
- 格式:doc
- 大小:294.00 KB
- 文档页数:12
数据结构课程设计报告设计题目:二叉树的基本操作专业:计算机科技院系:计算机学院姓名:xxxx学号:xxxxxxxx时间:2013年9月22日目录一、设计要求-------------------------------------------------------31.问题描述----------------------------------------------------32.需求分析----------------------------------------------------3二、详细设计--------------------------------------------------------31.概要设计-----------------------------------------------------32.各模块源代码-----------------------------------------------3三、用户手册--------------------------------------------------------9四、总结-------------------------------------------------------------10一、设计要求1.问题描述设计一个与二叉树基本操作相关的演示程序。
2.需求分析(1)创建二叉树。
按照用户需要构建二叉树(2)分别以先序、中序、后序遍历二叉树(3)查找子节点元素二、详细设计(附源代码)1.概要设计//定义二叉树数据结构typedefstructTNode{intnum;structTNode *lchild, *rchild;}TNode;2.各模块源代码(包含main()函数)#include<stdio.h>#include<stdlib.h>#define MaxLength 100//定义二叉树数据结构typedefstructTNode{intnum;structTNode *lchild, *rchild;}TNode;//声明全局变量rootstaticTNode *root=NULL;//声明插入新结点的函数(根非空)intmyInsert_Node(TNode *p, int n);//定义插入新节点的初始函数,拆开写的目的是递归时避免不必要的判断voidInsert_Node(int n){if(root==NULL) //如果根结点不存在则创建{root=(TNode *)malloc(sizeof(TNode));root->num=n;root->lchild=NULL;root->rchild=NULL;}else{myInsert_Node(root, n);//非根结点的插入操作}}intmyInsert_Node(TNode *p, int n){TNode *temp;if(n<p->num) //比当前结点小,则访问左子树{if(p->lchild==NULL) //左子树为空,则插入该结点{temp=(TNode *)malloc(sizeof(TNode));temp->num=n;temp->lchild=NULL;temp->rchild=NULL;p->lchild=temp;return 0;}else //左子树不为空,则与左子树进行比较{myInsert_Node(p->lchild,n);}}else //右子树同理{if(p->rchild==NULL){temp=(TNode *)malloc(sizeof(TNode));temp->num=n;temp->lchild=NULL;temp->rchild=NULL;p->rchild=temp;return 0;}else{myInsert_Node(p->rchild,n);}}}//前序递归遍历二叉树voidPre_travel(TNode *p){if(p){printf("%d ",p->num);Pre_travel(p->lchild);Pre_travel(p->rchild);}}//中序递归遍历二叉树voidMid_travel(TNode *p){if(p){Mid_travel(p->lchild);printf("%d ",p->num);Mid_travel(p->rchild);}}//后序递归遍历二叉树voidSuf_travel(TNode *p){if(p){Suf_travel(p->lchild);Suf_travel(p->rchild);printf("%d ", p->num);}}//中序非递归遍历二叉树/*从根节点开始,沿左子树一直走到没有左孩子的节点为止,并将所经过的节点的地址进栈;当找到没有左孩子的节点时,从栈顶退出该节点并访问它,此时,此节点的左子树已访问完毕;在用上述方法遍历该节点的右子树,如此重复到栈空为止。
二叉树的基本操作二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。
二叉树在计算机领域中得到广泛应用,它的基本操作包括插入、删除、查找、遍历等。
1.插入操作:二叉树的插入操作是将一个新的节点添加到已有的二叉树中的过程。
插入操作会按照一定规则将新节点放置在正确的位置上。
插入操作的具体步骤如下:-首先,从根节点开始,比较新节点的值与当前节点的值的大小关系。
-如果新节点的值小于当前节点的值,则将新节点插入到当前节点的左子树中。
-如果新节点的值大于当前节点的值,则将新节点插入到当前节点的右子树中。
-如果当前节点的左子树或右子树为空,则直接将新节点插入到该位置上。
-如果当前节点的左子树和右子树都不为空,则递归地对左子树或右子树进行插入操作。
2.删除操作:二叉树的删除操作是将指定节点从二叉树中删除的过程。
删除操作有以下几种情况需要考虑:-如果待删除节点是叶子节点,则直接将其从二叉树中删除即可。
-如果待删除节点只有一个子节点,则将其子节点替换为待删除节点的位置即可。
-如果待删除节点有两个子节点,则需要找到其左子树或右子树中的最大节点或最小节点,将其值替换为待删除节点的值,然后再删除最大节点或最小节点。
3.查找操作:二叉树的查找操作是在二叉树中查找指定值的节点的过程。
查找操作的具体步骤如下:-从根节点开始,将待查找值与当前节点的值进行比较。
-如果待查找值等于当前节点的值,则返回该节点。
-如果待查找值小于当前节点的值,则在当前节点的左子树中继续查找。
-如果待查找值大于当前节点的值,则在当前节点的右子树中继续查找。
-如果左子树或右子树为空,则说明在二叉树中找不到该值。
4.遍历操作:二叉树的遍历操作是按照一定规则依次访问二叉树中的每个节点。
有三种常用的遍历方式:- 前序遍历(Preorder Traversal):先访问根节点,然后递归地前序遍历左子树和右子树。
- 中序遍历(Inorder Traversal):先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。
数据结构与算法课程实验报告实验四:二叉树的基本操作姓名:沈靖雯班级:14信息与计算科学(2)班学号:2014326601094实验四二叉树的基本操作【实验内容】实现创建和遍历二叉树的基本操作【实验目的】掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法;掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍历算法的递归实现和非递归实现。
【问题描述】(1)编程实现构造一棵二叉树的算法,适合任意合法输入的二叉树的建立,并进行相应异常处理。
(2)编程实现在二叉链表这种存储方式下,实现二叉的遍历,可采用递归或者非递归实现,遍历算法可在先序、中序和后序遍历算法中任选其一。
【问题实现】一、实现链队列基本运算(1)抽象数据类型ADT BTree {数据对象D: D是具有相同特性的数据元素的集合。
基本操作:CreatBiTree(*T)操作结果:构造二叉树T。
PreOrderTraverse(T)初始条件:二叉树T已存在。
操作结果:先序遍历T。
InOrderTraverse(T)初始条件:二叉树T已存在。
操作结果:中序遍历T。
PostOrderTraverse(T)初始条件:二叉树T已存在。
操作结果:后序遍历T。
} ADT BTree(2)主要实现思路与主要程序代码:1).首先定义二叉树结点结构;typedef struct Node{char data;struct Node *lchild,*rchild; //左右孩子指针}BiTNode,*BTree;2).其次定义一个二叉树构造函数int CreatBiTree(BTree *T);采用递归先序法构造二叉树;scanf("%c",&ch);if(ch==' ')*T=NULL;//T为空二叉树else{if(!(*T=(BTree)malloc(sizeof(BiTNode)))) return (OVERFLOW);(*T)->data=ch;CreatBiTree(&((*T)->lchild));CreatBiTree(&((*T)->rchild));}3).定义遍历函数(递归先序为例);//先序遍历二叉树,递归实现void PreOrderTraverse(BTree T){if(T){ printf("%c ",T->data);PreOrderTraverse (T->lchild);PreOrderTraverse (T->rchild);}}这里用printf代替visit(),简化程序代码;4).定义主函数,总体完成以上所有函数功能的实现(构建二叉树与遍历二叉树)。
《数据结构与数据库》实验报告实验题目二叉树的基本操作及运算一、需要分析问题描述:实现二叉树(包括二叉排序树)的建立,并实现先序、中序、后序和按层次遍历,计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目,以及二叉树常用运算。
问题分析:二叉树树型结构是一类重要的非线性数据结构,对它的熟练掌握是学习数据结构的基本要求。
由于二叉树的定义本身就是一种递归定义,所以二叉树的一些基本操作也可采用递归调用的方法。
处理本问题,我觉得应该:1、建立二叉树;2、通过递归方法来遍历(先序、中序和后序)二叉树;3、通过队列应用来实现对二叉树的层次遍历;4、借用递归方法对二叉树进行一些基本操作,如:求叶子数、树的深度宽度等;5、运用广义表对二叉树进行广义表形式的打印。
算法规定:输入形式:为了方便操作,规定二叉树的元素类型都为字符型,允许各种字符类型的输入,没有元素的结点以空格输入表示,并且本实验是以先序顺序输入的。
输出形式:通过先序、中序和后序遍历的方法对树的各字符型元素进行遍历打印,再以广义表形式进行打印。
对二叉树的一些运算结果以整型输出。
程序功能:实现对二叉树的先序、中序和后序遍历,层次遍历。
计算叶子结点数、树的深度、树的宽度,求树的非空子孙结点个数、度为2的结点数目、度为2的结点数目。
对二叉树的某个元素进行查找,对二叉树的某个结点进行删除。
测试数据:输入一:ABC□□DE□G□□F□□□(以□表示空格),查找5,删除E预测结果:先序遍历ABCDEGF中序遍历CBEGDFA后序遍历CGEFDBA层次遍历ABCDEFG广义表打印A(B(C,D(E(,G),F)))叶子数3 深度5 宽度2 非空子孙数6 度为2的数目2 度为1的数目2查找5,成功,查找的元素为E删除E后,以广义表形式打印A(B(C,D(,F)))输入二:ABD□□EH□□□CF□G□□□(以□表示空格),查找10,删除B预测结果:先序遍历ABDEHCFG中序遍历DBHEAGFC后序遍历DHEBGFCA层次遍历ABCDEFHG广义表打印A(B(D,E(H)),C(F(,G)))叶子数3 深度4 宽度3 非空子孙数7 度为2的数目2 度为1的数目3查找10,失败。
二叉排序树课程设计一、课程目标知识目标:1. 学生能够理解二叉排序树的基本概念和性质,掌握其结构特点和应用场景。
2. 学生能够掌握二叉排序树的插入、删除和查找操作,并了解其时间复杂度。
3. 学生能够理解二叉排序树与其他排序算法的关系,了解其在排序中的应用。
技能目标:1. 学生能够运用所学知识,独立构建二叉排序树,并实现插入、删除和查找功能。
2. 学生能够分析二叉排序树的性能,对其进行优化,提高排序效率。
3. 学生能够运用二叉排序树解决实际问题,如数据排序、查找等。
情感态度价值观目标:1. 学生通过学习二叉排序树,培养对数据结构和算法的兴趣,提高解决问题的能力。
2. 学生在学习过程中,学会合作、交流,培养团队精神和共享意识。
3. 学生能够认识到二叉排序树在实际应用中的价值,激发对计算机科学的热爱。
本课程针对高中年级学生,课程性质为理论与实践相结合。
在教学过程中,注重启发式教学,引导学生主动探究、实践。
根据学生特点和教学要求,课程目标具体、可衡量,以便学生和教师能够清晰地了解课程的预期成果。
课程目标的分解为具体的学习成果,为后续的教学设计和评估提供依据。
二、教学内容1. 引入二叉排序树的概念,讲解其定义、性质和基本操作。
- 理解二叉树的基础知识,回顾二叉树的遍历方法。
- 介绍二叉排序树的定义,阐述其特点及应用场景。
- 分析二叉排序树的性质,如二叉排序树的中序遍历结果为有序序列。
2. 探讨二叉排序树的构建、插入、删除和查找操作。
- 讲解二叉排序树的构建方法,学会从无序数据建立二叉排序树。
- 分析插入、删除和查找操作的步骤,理解它们的时间复杂度。
- 举例说明如何利用二叉排序树实现数据排序和查找。
3. 分析二叉排序树的性能及优化方法。
- 探讨二叉排序树的高度、平衡因子等性能指标。
- 介绍常见的优化方法,如平衡二叉树(AVL树)和红黑树。
4. 实践环节:二叉排序树的应用。
- 设计实践题目,让学生动手实现二叉排序树的基本操作。
二叉排序树课程设计一、课程目标知识目标:1. 理解二叉排序树的概念和特点;2. 掌握二叉排序树的插入、删除和查找操作;3. 能够分析二叉排序树的时间复杂度;4. 了解二叉排序树在实际应用中的优势。
技能目标:1. 能够手动构建二叉排序树并进行基本操作;2. 能够运用编程语言实现二叉排序树的基本功能;3. 能够分析并解决二叉排序树相关的问题;4. 能够运用二叉排序树解决实际排序和查找问题。
情感态度价值观目标:1. 培养学生对数据结构和算法的兴趣,激发学习热情;2. 培养学生的逻辑思维能力和问题解决能力;3. 培养学生的团队协作意识,学会与他人共同分析、解决问题;4. 培养学生严谨的科学态度,注重算法的正确性和效率。
课程性质:本课程为计算机科学领域的数据结构与算法课程,旨在让学生掌握二叉排序树的基本概念和操作,提高学生的编程能力和逻辑思维能力。
学生特点:学生具备基本的计算机知识和编程基础,对数据结构有一定了解,但对二叉排序树的认识可能较浅。
教学要求:结合学生特点,采用讲解、实践和讨论相结合的教学方法,使学生在理解二叉排序树理论知识的基础上,能够动手实践并解决实际问题。
在教学过程中,注重培养学生的自主学习能力和团队合作精神,提高学生的综合素质。
通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程打下坚实基础。
二、教学内容1. 引入二叉排序树的概念,阐述其定义、性质和应用场景;- 教材章节:第三章第一节“二叉排序树的定义和性质”2. 讲解二叉排序树的插入、删除、查找操作及其实现方法;- 教材章节:第三章第二节“二叉排序树的操作”3. 分析二叉排序树的性能特点,包括时间复杂度和空间复杂度;- 教材章节:第三章第三节“二叉排序树的性能分析”4. 介绍二叉排序树在实际应用中的优势,如排序、查找等;- 教材章节:第三章第四节“二叉排序树的应用”5. 结合实例,让学生动手实践二叉排序树的构建和操作;- 教材章节:第三章实例分析与编程练习6. 总结二叉排序树的特点和适用场景,与其他排序方法进行对比;- 教材章节:第三章总结与拓展教学进度安排:1. 第1课时:引入二叉排序树的概念、性质和应用场景;2. 第2课时:讲解二叉排序树的插入、删除、查找操作;3. 第3课时:分析二叉排序树的性能特点;4. 第4课时:介绍二叉排序树在实际应用中的优势;5. 第5课时:结合实例,学生动手实践二叉排序树的构建和操作;6. 第6课时:总结二叉排序树,与其他排序方法进行对比。
二叉树的基本操作与实现实验报告二叉树是一种重要的数据结构,在计算机科学领域中被广泛应用。
本实验将介绍二叉树的基本操作与实现,并给出相应的实验报告。
一、引言二叉树是一种特殊的树状结构,每个节点至多有两个子节点。
二叉树有许多重要的特性,如平衡二叉树、二叉树等,应用广泛。
在本实验中,我们将介绍二叉树的基本操作和实现。
二、实验目的1.掌握二叉树的基本概念和特性;2.熟悉二叉树的基本操作,包括创建、插入、删除、遍历等;3.学会使用编程语言实现二叉树的基本操作。
三、实验内容本实验主要包括以下内容:1.二叉树的定义和基本概念;2.二叉树的基本操作,包括创建、插入、删除、遍历等;3.使用编程语言实现二叉树的基本操作;4.测试和验证二叉树的基本操作的正确性。
四、实验步骤1.二叉树的定义和基本概念二叉树是一种树状结构,每个节点至多有两个子节点。
二叉树的每个节点包含一个数据项和指向左子树和右子树的指针。
二叉树的特性有很多,如完全二叉树、平衡二叉树、二叉树等。
2.二叉树的基本操作(1)创建二叉树:可以通过手动输入节点数据来创建二叉树,也可以通过读取文件中的数据来创建二叉树。
(2)插入节点:在指定位置插入一个新节点。
(3)删除节点:删除指定位置的节点。
(4)遍历二叉树:有前序遍历、中序遍历和后序遍历三种遍历方式。
3.使用编程语言实现二叉树的基本操作实现二叉树的基本操作可以使用编程语言来完成。
我们可以定义一个二叉树的结构体,包含节点数据和指向左右子树的指针。
然后根据具体的需求,实现相应的操作函数。
4.测试和验证二叉树的基本操作的正确性在完成二叉树的基本操作后,我们可以编写测试代码来验证操作的正确性。
通过创建二叉树,并进行插入、删除和遍历操作,观察输出结果是否符合预期。
五、实验结果与分析在完成二叉树的基本操作后,我们可以进行测试和验证。
通过输出二叉树的遍历结果,比对预期结果来判断操作是否正确。
同时,我们还可以观察二叉树的结构和特性,如是否满足平衡二叉树或二叉树的条件。
二叉树的基本操作二叉树是一种常见的数据结构,它由节点组成,每个节点最多连接两个子节点,分别称为左子节点和右子节点。
二叉树的基本操作包括创建、插入、删除、查找和遍历,下面将对这些操作进行详细介绍。
一、创建二叉树创建二叉树的方法有多种,其中最常用的是使用递归的方式。
递归创建二叉树时,可以先创建根节点,然后递归创建左子树和右子树。
如果子树为空,则使用特殊字符表示。
二、插入节点插入节点是向二叉树中添加新节点的操作。
插入节点的位置通常由二叉树的特性决定,左子节点小于父节点,右子节点大于父节点。
插入节点时,需要先找到插入位置,然后创建新节点,并将其连接到对应的位置。
三、删除节点删除节点是从二叉树中移除指定节点的操作。
删除节点的方式取决于节点的位置和子节点的情况。
如果要删除的节点是叶子节点,则直接将其删除即可。
如果要删除的节点有一个子节点,则将其子节点连接到父节点。
如果要删除的节点有两个子节点,则需要找到替代节点,将替代节点的值复制到当前位置,并将替代节点删除。
四、查找节点查找节点是在二叉树中寻找特定节点的操作。
常用的方式有深度优先(DFS)和广度优先(BFS)。
深度优先通常使用递归实现,分为前序遍历、中序遍历和后序遍历三种方式。
广度优先通常使用队列实现,先访问根节点,然后访问其所有子节点,再逐层访问下去,直到找到目标节点或遍历完整棵树。
五、遍历二叉树遍历二叉树是指按照一定顺序访问二叉树中的所有节点,常用的方式有前序遍历、中序遍历和后序遍历。
前序遍历先访问根节点,然后递归遍历左子树和右子树;中序遍历先递归遍历左子树,然后访问根节点,再遍历右子树;后序遍历先递归遍历左子树和右子树,然后访问根节点。
以上是二叉树的基本操作,通过这些操作可以有效地管理和处理二叉树数据结构。
在实际应用中,二叉树常用于、排序和表达等方面,因为它具有较高的查询效率和灵活性。
对于使用二叉树的相关算法和数据结构,理解和掌握其基本操作是非常重要的。
重庆大学城市科技学院课程设计报告二叉树的基本操作学院:电气信息学院专业:软件工程年级: 2011 姓名:班级: 01 学号: 20110286 成绩:完成时间: 2013年1月2日指导教师:目录一、需求分析 (3)二、概要设计 (3)三、详细设计 (4)四、调试结果 (11)五、课程设计总结 (11)一、需求分析二叉树形象地说即树中每个节点最多只有两个分支,它是一种重要的数据类型。
可以运用于建立家谱,公司所有的员工的职位图,以及各种事物的分类和各种机构的职位图表等。
二叉树是通过建立一个链式存储结构,达到能够实现前序遍历,中序遍历,后序遍历。
以及能够从输入的数据中得知二叉树的叶子结点的个数,二叉树的深度。
在此,二叉树的每一个结点中必须包括:值域,左指针域,右指针域。
演示程序以用户与计算机对话的方式进行,即在计算机终端上显示提示信息后,由用户在键盘上输入相应动作的序号和相应的输入数据。
1.1课程设计任务及要求(1)按先序次序输入二叉树中结点的值,构造二叉链表表示的二叉树t;(2)对二叉树t作先序、中序、后序遍历的递归算法,输出结果;(3)计算二叉树t的深度,输出结果;(4)计算二叉树t的叶子结点个数1.2课程设计思想本次课程设计中,用到的主要知识就是递归思想,着重体会递归的思想。
建立二叉树采用先序次序插入的方式。
对二叉树进行遍历时采用递归函数的方式。
求二叉树的深度及叶子结点个数均采用递归方式。
二、概要设计2.1对程序中定义的核心数据结构及对其说明:typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;在开头定义了二叉树的链式存储结构,此处采用了每个结点中设置三个域,即值域,左指针域和右指针域。
2.2 程序模块及其功能:本程序分为:7大模块。
二叉树的建立链式存储结构、前序遍历、中序遍历、后序遍历、求叶子结点的个数计算、中序遍历、后序遍历、深度、主函数。
1、二叉树的建立链式存储结构;首先typedef struct BiTNode:定义二叉树的链式存储结构,此处采用了每个结点中设置三个域,data:即值域,*lchild:左指针域和rchild:右指针域。
2、二叉树的前序遍历;利用二叉链表作为存储结构的前序遍历:先访问根结点,再依次访问左右子树。
3、二叉树的中序遍历;利用二叉链表作为存储结构的中序遍历:先访问左子数,再访问根结点,最后访问右子树。
4、二叉树的后序遍历;利用二叉链表作为存储结构的前序遍历:先访问左右子树,再访问根结点。
5、求二叉树的深度:首先判断二叉树是否为空,若为空则此二叉树的深度为0。
否则,就先别求出左右子树的深度并进行比较,取较大的+1就为二叉树的深度。
6、二叉树的求叶子结点的个数计算;先分别求得左右子树中各叶子结点个数,再计算出两者之和即为二叉树的叶子结点数。
7、主函数。
主函数中分别调用各函数。
三、详细设计3.1存储结构的建立由递归函数实现具体函数为:typedef struct bitnode{telemtype data;struct bitnode *lchild,*rchild;}bitnode ,*bitree;bitree createbitree(bitree t){char ch;scanf("%c",&ch);if(ch=='#') t=NULL;else{if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow);t->data=ch;t->lchild=createbitree(t->lchild);t->rchild=createbitree(t->rchild);}return t;}在创建的二叉树中,左右孩子都为字符型。
char的作用是输入n个任意的字符,而且在输入n个字符后,必须输入n+1个'0',才能得到本程序所有能够实现的功能。
t=Null是将二叉树置空。
if(!(t=(bitnode *)malloc(sizeof(bitnode)))),采用动态申请新结点的方式,不仅实现起来方便,而且还节省大量的存储空间。
t->data=ch;值域t->lchild=createbitree(t->lchild);t->rchild=createbitree(t->rchild);将二叉树中的每一个结点设置为:值域,左指针域,右指针。
这一小段程序实现了二叉树的置空,二叉树的建立,二叉树的存储。
3.2前序遍历:先访问根结点,再访问左子树,最后访问右子树。
具体函数为:void preordertraverse(bitree t){if(t){printf("%c",t->data);preordertraverse(t->lchild);preordertraverse(t->rchild);}}3.3中序遍历:先访问左子树,再访问根结点,最后访问右子树。
具体函数为:void inordertraverse(bitree t){if (t){inordertraverse(t->lchild);printf("%c",t->data);inordertraverse(t->rchild);}}3.4后序遍历:先访问左子树,再访问右子树,最后访问根结点。
具体函数为:void postordertraverse(bitree t){if(t){postordertraverse(t->lchild);postordertraverse(t->rchild);printf("%c",t->data);}}3.5求二叉树的深度:先定义三个整形变量m,n.如果树为空,则height=0;否则,先分别访问出左右子树的深度,再进行比较,将较大的+1的结果就是所求二叉树的深度。
具体函数为:int height(bitree t){int m,n;if(t==NULL) return 0;else{m=height(t->lchild);n=height(t->rchild);return (m>n)?m+1:n+1;}}3.6求叶子结点的个数:用leafcount变量表示叶子结点的总个数,用leafcount(t->lchild)、leafcount(t->rchild)分别表示访问的左右子树中叶子结点的个数。
当树为空时讨论叶子结点个数无意义;当树非空时分为:一、左右子数都不存在时,即叶子结点的个数为1;二、左右子树存在,就用分别访问出左右子树中叶子结点的个数,两者相加就为二叉树叶子结点的个数。
具体函数为:int leafcount(bitree t){if(!t) return 0; //空数无叶子else if(!t->lchild&&!t->rchild) return 1;else return leafcount(t->lchild)+leafcount(t->rchild);}3.7主函数:包括:二叉树的数据结构bitree t、函数createbitree、height、leafcount、前序遍历preordertraverse、中序遍历inordertraverse、后序遍历postordertraverse。
具体函数为:void main(){bitree t;int w,v;printf("请输入建树字符序列:");t=createbitree(t);printf("先序遍历的结果是:");preordertraverse(t);printf("\n");printf("中序遍历的结果是:");inordertraverse(t);printf("\n");printf("后序遍历的结果是:");postordertraverse(t);printf("\n");printf("二叉树的深度是:");w=height(t);printf("%d\n",w);printf("二叉树的叶子结点的数目为:");v=leafcount(t);printf("%d",v);printf("\n");}3.8完整代码:#include <stdio.h>#include <malloc.h>#include <process.h>#define ok 1#define error 0#define overflow -1typedef char telemtype;typedef struct bitnode //存储结构的建立{telemtype data;struct bitnode *lchild,*rchild;}bitnode ,*bitree;bitree createbitree(bitree t){char ch;scanf("%c",&ch);if(ch=='0') t=NULL; //t=NULL是将二叉树置空else{if(!(t=(bitnode *)malloc(sizeof(bitnode)))) exit(overflow); //动态申请新结点t->data=ch; //值域t->lchild=createbitree(t->lchild); //左指针域t->rchild=createbitree(t->rchild); //右指针域}return t;}//先序遍历void preordertraverse(bitree t) {if(t){printf("%c",t->data);preordertraverse(t->lchild);preordertraverse(t->rchild);}}//中序遍历void inordertraverse(bitree t) {if (t){inordertraverse(t->lchild);printf("%c",t->data);inordertraverse(t->rchild);}}//后序遍历void postordertraverse(bitree t) {if(t){postordertraverse(t->lchild);postordertraverse(t->rchild);printf("%c",t->data);}}//判断深度int height(bitree t){int m,n;if(t==NULL) return 0;else{m=height(t->lchild);n=height(t->rchild);return (m>n)?m+1:n+1;}}//叶子结点个数int leafcount(bitree t) //leafcount表示叶子结点的总个数{if(!t) return 0; //空数无叶子else if(!t->lchild&&!t->rchild) return 1;else return leafcount(t->lchild)+leafcount(t->rchild); }void main(){bitree t;int w,v;printf("请输入建树字符序列,以0表示NULL:");t=createbitree(t);printf("先序遍历的结果是:");preordertraverse(t);printf("\n");printf("中序遍历的结果是:");inordertraverse(t);printf("\n");printf("后序遍历的结果是:");postordertraverse(t);printf("\n");printf("二叉树的深度是:");w=height(t);printf("%d\n",w);printf("二叉树的叶子结点的数目为:");v=leafcount(t);printf("%d",v);printf("\n");}四、测试结果五、课程设计总结--本程序基本上实现了前序遍历,中序遍历,后序遍历,叶子结点个数的求出,二叉树深度的求出等基本操作。