实验6 二叉树

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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) {

相关文档
最新文档