完整word版广东工业大学数据结构二叉树课程设计.docx
《完整word版广东工业大学数据结构二叉树课程设计.docx》由会员分享,可在线阅读,更多相关《完整word版广东工业大学数据结构二叉树课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
完整word版广东工业大学数据结构二叉树课程设计
数据结构实验报告
题目:
二叉树抽象数据类型
学院计算机学院
专业计算机科学与技术
年级班别
学号
学生姓名
指导教师
成绩____________________
2013年6月
一.实验概要
实验项目名称:
二叉树抽象数据类型的实现
实验项目性质:
设计性实验
所属课程名称:
数据结构
实验计划学时:
6
二.实验目的
1.了解二叉树的定义以及各项基本操作。
2.实现二叉树存储、遍历及其他基本功能
三.实验仪器设备和材料
硬件:
PC机
软件:
VisualC++6.0
四.实验的内容
1.二叉树类型定义以及各基本操作的简要描述;
ADTBinaryTree{
数据对象D:
D是具有相同特性的数据元素的集合.
数据关系R:
若D=∅,则R=,称BinaryTree为空二叉树;
若D≠,则R={H},H是如下二元关系:
(1)在D中存在惟一的称为根的数据元素root,它在关系H下无前驱;
(2)若D-{root}≠∅,则存在D-{root}={D1,Dr},且D1∩Dr=∅;
(3)若D1≠∅,则D1中存在惟一的元素x1,∈H,且存在Dr上的关系Hr∈H;H={,,H1,Hr};
(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,是一棵符合本定义的二叉树,称为根的右子树。
基本操作P:
InitBiTree(&T);
操作结果:
构造空二叉树T。
DestroyBiTree(&T);
初始条件:
二叉树T存在。
操作结果:
销毁二叉树T。
CreateBiTree(&T,definition);
初始条件:
definition给出二叉树T的定义。
操作结果:
按definition构造二叉树T。
ClearBiTree(&T);
初始条件:
二叉树T存在。
操作结果:
将二叉树T清为空树。
BiTreeEmpty(T);
初始条件:
二叉树T存在。
操作结果:
若T为空二叉树,则返回TURE,否则FALSE。
BiTreeDepth(T);
初始条件:
二叉树T存在。
操作结果:
返回T的深度。
Root(T);
初始条件:
二叉树T存在。
操作结果:
返回T的根。
Value(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
返回e的值。
Assign(T,&e,value);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
结点e赋值为value。
Parent(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
若e是T的非跟结点,则返回它的双亲,否则返回“空”。
LeftChild(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
返回e的左孩子。
若e无左孩子,则返回“空”。
RightChild(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
返回e的右孩子。
若e无右孩子,则返回“空”。
LeftSibling(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
返回e的左兄弟。
若e无左孩子或无左兄弟,则返回“空”。
RightSibling(T,e);
初始条件:
二叉树T存在,e是T中的某个结点。
操作结果:
返回e的右兄弟。
若e无右孩子或无右兄弟,则返回“空”。
}ADTBinaryTree
2.存储结构:
采用无头结点的链式存储结构实现
3.源代码:
头文件及存储结构:
#include
#include
#defineTURE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW0
#defineMAXQSIZE100//最大队列长度
typedefcharTElemType;
typedefstructBiTNode//二叉树结构体
{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
typedefBiTreeQElemType;
typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;//结点结构体
typedefstruct
{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;//链队列结构体
算法设计:
intInitQueue(LinkQueue&Q)//构造空队列
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!
Q.front)//存储分配失败
exit(OVERFLOW);
Q.front->next=NULL;
returnOK;
}
intEnQueue(LinkQueue&Q,QElemTypee)//新元素入队尾
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
if(!
p)//存储分配失败
exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
returnOK;
}
intDeQueue(LinkQueue&Q,QElemType&e)//删除队头元素
{
QueuePtrp;
if(Q.front==Q.rear)//队列为空队
returnERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)//判断删除队头元素后,队列是否为空队
Q.rear=Q.front;
free(p);
returnOK;
}
intQueueEmpty(LinkQueueQ)//判断队列是否为空队
{
if(Q.front==Q.rear)
returnTURE;
else
returnFALSE;
}
intInitBiTree(BiTree&T)//构造空二叉树
{
T=NULL;
returnOK;
}
intDestroyTree(BiTree&T)//销毁二叉树
{
if(!
T)
returnERROR;
else
DestroyTree(T->lchild);
DestroyTree(T->rchild);
free(T);
T=NULL;
returnOK;
}
voidCreateBiTree(BiTree&T)//用先序遍历的方式构建二叉树,以‘@’表示空结点。
{
TElemTypech;
scanf("%c",&ch);
if(ch=='@')
T=NULL;
else
{
if(!
(T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);//分配存储空间失败
T->data=ch;
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
}
intClearBiTree(BiTree&T)//清空二叉树函数
{
if(!
T)
returnERROR;
else
{
ClearBiTree(T->lchild);
ClearBiTree(T->rchild);
free(T);
T=NULL;
returnOK;
}
}
intBiTreeEmpty(BiTreeT)//判断二叉树是否为空
{
if(!
T)
returnTURE;
else
returnFALSE;
}
intBiTreeDepth(BiTreeT)//计算二叉树深度
{
intlcd,rcd;
if(!
T)
return0;
lcd=BiTreeDepth(T->lchild);
rcd=BiTreeDepth(T->rchild);
return((lcd>rcd?
lcd:
rcd)+1);
}
TElemTypeRoot(BiTreeT)//判断二叉树是否空,若非空返回其根
{
if(BiTreeEmpty(T))
returnNULL;
else
return(T->data);
}
TElemTypeValue(BiTreeT,BiTreee)//返回e结点的值
{
returne->data;
}
intAssign(BiTreeT,BiTree&e,TElemTypevalue)//将value的值给结点e
{
e->data=value;
returnOK;
}
TElemTypeParent(BiTreeT,TElemTypee)
{//返回双亲
LinkQueueq;
QElemTypea;
if(T)
{
InitQueue(q);
EnQueue(q,T);//树根入队列
while(!
QueueEmpty(q))//队不空
{
DeQueue(q,a);//出队,队列元素赋给a
if(a->lchild&&a->lchild->data==e||a->rchild&&a->rchild->data==e)//找到e
returna->data;//返回双亲的值
else
{
if(a->lchild)
EnQueue(q,a->lchild);//入队列左孩子
if(a->rchild)
EnQueue(q,a->rchild);//入队列右孩子
}
}
}
returnNULL;
}
BiTreePoint(BiTreeT,TElemTypes)//返回二叉树T中指向元素值为S的结点指针
{
LinkQueueq;
QElemTypea;
if(T)
{
InitQueue(q);
EnQueue(q,T);
while(!
QueueEmpty(q))
{
DeQueue(q,a);
if(a->data==s)
{
returna;
}
if(a->lchild)
{
EnQueue(q,a->lchild);
}
if(a->rchild)
{
EnQueue(q,a->rchild);
}
}
}