实验6 二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六二叉树
一、实验的目的和要求
1.掌握树和二叉树的以分支关系定义的层次结构;掌握树和二叉树的基本概念和术语;以及二元组描述的逻辑结构的递归特性;二叉树的五个性质。
2.掌握二叉树的链式存储结构特点;C语言的类型描述形式。
3.重点掌握二叉树的先序、中序、后序遍历运算的递归和非递归的实现;掌握利用队列对二叉树进行层次遍历运算;能进行性能分析。
4.掌握二叉树的其它几种运算的实现方法,重点掌握利用二叉树的递归特性进行算法的设计。如:求叶子结点、求深度等。
二、实验的内容和步骤
1.建立一个二叉树的头文件,文件名为bintree.h,内容是二叉树的数据类型描述和基本运算的说明(为了方便可以包括运算的实现)
/*以下是bintree.h的头文件内容。*/
/*定义二叉树结点数据域类型*/
typedef char ElemType ;
/*定义二叉树结点类型和二叉树结点指针类型*/
typedef struct BiTNode{
ElemType data ;
struct BiTNode *lchild, *rchild ;
} BinTNode, *BinTreeTp ;
/*定义队列和栈的最大长度*/
#define MAXLEN 100
/****下面是二叉树的基本运算****/
/*创建二叉树操作*/
void CreatBinTree(BinTreeTp *T);
/*先序遍历二叉树递归操作*/
void PreOrder(BinTreeTp T, void (*Visit)(ElemType));
/*中序遍历二叉树递归操作*/
void InOrder(BinTreeTp T, void (*Visit)(ElemType));
/*后序遍历二叉树递归操作*/
void PostOrder(BinTreeTp T, void (*Visit)(ElemType));
/*先序遍历二叉树非递归操作*/
void PreOrderN(BinTreeTp T, void (*Visit)(ElemType));
/*中序遍历二叉树非递归操作*/
void InOrderN(BinTreeTp T, void (*Visit)(ElemType));
/*后序遍历二叉树非递归操作*/
void PostOrderN(BinTreeTp T, void (*Visit)(ElemType));
/*层次遍历二叉树操作*/
void LevelOrder(BinTreeTp T, void (*Visit)(ElemType));
2.基本运算的实现,
/****二叉树的运算实现****/
/*创建二叉树操作,本操作创建一个由先序顺序输入的字符组成的二叉树。*/ void CreatBinTree(BinTreeTp *T)
{
ElemType ch ;
if ((ch = getchar()) == '#')
*T = NULL ;
else {
*T = (BinTreeTp)malloc(sizeof(BinTNode)) ;
(*T)->data = ch ;
CreatBinTree(&(*T)->lchild) ;
CreatBinTree(&(*T)->rchild) ;
}
}
/*先序遍历二叉树操作*/
void PreOrder(BinTreeTp T, void (*Visit)(ElemType))
{
if (T) {
(*Visit)(T->data);
PreOrder(T->lchild, Visit) ;
PreOrder(T->rchild, Visit) ;
}
}
/*中序遍历二叉树操作*/
void InOrder(BinTreeTp T, void (*Visit)(ElemType))
{
if (T) {
InOrder(T->lchild, Visit) ;
(*Visit)(T->data) ;
InOrder(T->rchild, Visit) ;
}
}
/*后序遍历二叉树操作*/
void PostOrder(BinTreeTp T, void (*Visit)(ElemType)) {
if (T) {
PostOrder(T->lchild, Visit) ;
PostOrder(T->rchild, Visit) ;
(*Visit)(T->data) ;
}
}
/*先序遍历二叉树的非递归操作*/
void PreOrderN(BinTreeTp T, void (*Visit)(ElemType)) {
BinTreeTp stack[MAXLEN], p ;
int top = -1 ;
if (!T) return ;
p = T ;
do{
while(p) {
(*Visit)(p->data);
stack[++top] = p ;
p = p->lchild ;
}
if(top != -1) {
p = stack[top--] ;
p = p->rchild ;
}
}while(p || top!=-1) ;
}
/*中序遍历二叉树的非递归操作*/
void InOrderN(BinTreeTp T, void (*Visit)(ElemType)) {
BinTreeTp stack[MAXLEN], p ;
int top = -1 ;
if (!T) return ;
p = T ;
do{
while(p) {