二叉树的建立及相关算法的实现

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

数据结构实验

实验四

二叉树的建立及相关算法的实现

计算机科学与技术系0901班

组长:

组员:

日期:2011-05-05

2009级 0901班 2011年05月05日

实验类型:综合设计型 实验室:软件实验室三

组长: 组员:

1. 实验题目

二叉树的建立及相关算法的实现

2. 需求分析

本演示程序用VC++编写,实现了以下功能

① 建立一棵二叉树,然后对其进行先序、中序和后序遍历。 ② 显示二叉树

③ 求二叉树的高度及二叉树的叶子个数等等

④ 在主函数中设计一个简单的菜单,分别调试上述算法

3. 概要设计

为了实现上述程序功能,需要定义栈的抽象类型如下: ADT Stack{

数据对象:D={i a |i a ∈ElemSet,i=1,2,…,n, n ≧0}

数据对象:R1={<1,-i i a a >|1-i a ,D a i ∈,i=2,…,n}

约定n a 端为栈顶,i a 端为栈底。

基本操作:

InitStack(&S)

操作结果:构造一个空栈S 。 GetTop(S)

初始条件:栈S 已存在。

操作结果:用P 返回S 的栈顶元素。 Push(&S ,ch)

初始条件:栈S 已存在。

操作结果:插入元素ch 为新的栈顶元素。 Pop(&S)

初始条件:栈S 已存在。

操作结果:删除S 的栈顶元素。

}ADT Stack ADT Binary Tree{

数据对象 D :D 是具有相同特性的数据元素的集合。 基本操作 P :

InintBiTree(&T)

操作结果:构造空二叉树T 。 CreateBiTree(&T,definition);

初始条件:definition 给出二叉树T 的定义 操作结果:按definition 构造二叉树T.

Preordertraverse(T,Visit());

初始条件:二叉树T存在,Visit是对节点操作的应用函数。

操作结果:先序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。

Inordertraverse(T,Visit());

初始条件:二叉树T存在,Visit是对节点操作的应用函数。

操作结果:中序序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。

Postordertraverse(T,Visit())

初始条件:二叉树T存在,Visit是对节点操作的应用函数。

操作结果:后序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。

Levelordertraverse(T,Visit())

初始条件:二叉树T存在,Visit是对节点操作的应用函数。

操作结果:层序遍历T,对每个节点调用函数Visit一次且仅一次。一旦visit()失败,则操作失败。

}ADT BinaryTree

本程序还包含个函数:

(1)计算叶子总数函数:int Sumleaf(BiTree T)

(2)左右子数交换函数:void jiaohuan(BiTree T)

(3)节点数计算函数:int jiedianshu(BiTree T)

(4)深度计算函数:int Depth(BiTree T)

(5)显示二叉树函数:void xianshi(BiTree T)

函数调用图如下:

4.详细设计

#include

#include

#include

#define maxqsize 100

#define stackincrement 10

typedef struct BiTNode{

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

typedef struct{

BiTNode *base;

BiTNode *top;

int stacksize;

}sqstack;

void initstack (sqstack *s) //建栈

{s->base=(BiTNode *)malloc(maxqsize * sizeof(BiTNode));

if(!s->base) printf("存储空间失败!");

else

{s->top=s->base; s->stacksize=maxqsize;}}

void push(sqstack *s,BiTNode e) //压栈

{if(s->top-s->base==s->stacksize)

{s->base=(BiTNode *)realloc(s->base,(s->stacksize+stackincrement) * sizeof(BiTNode));

if(!s->base) printf("存储空间失败"); else

{s->top=s->base+s->stacksize;s->stacksize+=stackincre

*(s->top)=e; s->top++;}

BiTNode pop(sqstack *s) //弹出

{s->top--;return *s->top;}int sety(sqstack *s)

{if(s->top==s->base) return 1; else return 0;}

BiTree Create(BiTree T) //构造二叉链表

{ char ch; ch=getchar(); if(ch=='@') T=NULL; else

{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("Error!");

T->data=ch; T->lchild=Create(T->lchild); T->rchild=Create(T->rchild); }

相关文档
最新文档