二叉树实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告

专业计算机科学与技术

班级3班

姓名

学号

指导教师

起止时间2012.12~2013.1

课程设计:二叉树

一、任务描述

二叉树的中序、前序、后序的递归、非递归遍历算法,应包含建树的实现。

任务:设计一个程序,实现二叉树的前序、中序、后序的递归遍历运算。

要求:

(1)创建二叉树;

(2)二叉树的前序、中序、后序的递归遍历运算实现。

二、问题分析

1、功能分析

分析设计课题的要求,要求编程实现以下功能:

(1)二叉树的建立—即创建二叉树;

(2)二叉树的遍历—二叉树的前序、中序、后序操作;

2、数据对象分析

二叉树的遍历:包括前序、中序、后序

将二叉树补充到完全二叉树在输入,才能正确创建二叉树

三、数据结构设计

二叉树的建立和遍历的实现。有关的定义如下:

typedef int Status;

typedef char TElemType; //定义二叉树结点值的类型为字符型

struct BiTNode {//定义二叉树结点类型栈结点的类型

TElemType data; //数据域

BiTNode *lchild,*rchild;//指针域

};BiTNode *BiTree;

四、功能设计

(一)主控菜单设计

程序运行后,输入提示,如下:“创建二叉树,请按前序序列输入各节点值:”

正确输入二叉树后,提示“已成功创建二叉树”

(二)程序模块结构

由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数):

●创建二叉树的函数void CreateBiTree(BiTree &T);

●二叉树的前序遍历函数Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType));

●二叉树的中序遍历函数Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType));

●二叉树的后序遍历函数Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType));

●最简单的visit函数Status Visit(TElemType e);

(三)函数调用关系

程序的主要结构(函数调用关系)如下图所示。

其中main()是主函数,它进行菜单驱动。

BiTree T;

int n=0;

printf("创建二叉树,请按前序序列输入各节点值:\n");

CreateBiTree(T);

printf("\n");

printf("已成功创建二叉树\n");

PreOrderTraverse( T,Visit);

printf("\n");

InOrderTraverse(T,Visit);

printf("\n");

PostOrderTraverse(T,Visit);

printf("\n");

(四)文件结构

1、tree.h:二叉树相关的定义与声明

2、tree.cpp:二叉树运算的实现

5、mn.cpp:主函数

(五)各函数的算法设计

1、CreateBiTree()

算法原理:按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,构造二叉链表

代码描述:void CreateBiTree(BiTree &T)

{char ch;

ch=getchar(); //读入一个字符

printf("%c",ch);

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

else {if (!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);

//内存分配成功

T->data = ch; //生成根结点

CreateBiTree(T->lchild);

CreateBiTree(T->rchild);

}

}

算法的时间复杂度分析:O(1)

2、PreOrderTraverse ()

算法原理:若二叉树为空,则空操作;否则(1)访问根结点;(2)先序遍历左子树(3)先序遍历右子树

流程图:

流程图

代码描述:Status PreOrderTraverse (BiTree T,Status (*visit)(TElemType e))

{ /*功能:先序遍历二叉树;参数:T为二叉树的根,visit为对结点的处理方法*/ if (T) { //若根结点不空

if(visit(T->data)) //访问根结点

if (PreOrderTraverse(T->lchild,visit)) //先序遍历根的左子树

if(PreOrderTraverse(T->rchild,visit)) //先序遍历根的右子树

return OK;

}

}

算法的时间复杂度分析:O(n)

3、InOrderTraverse ()

算法原理:若二叉树为空,则空操作;否则(1)中序遍历左子树;(2)访问根结点;(3)

流程图:

相关文档
最新文档