广东工业大学数据结构二叉树课程设计Word格式.docx
- 文档编号:19113552
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:25
- 大小:232.90KB
广东工业大学数据结构二叉树课程设计Word格式.docx
《广东工业大学数据结构二叉树课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《广东工业大学数据结构二叉树课程设计Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
(3)若D1≠∅,则D1中存在惟一的元素x1,<
root,x1>
∈H,且存在Dr上的关系Hr∈H;
H={<
,<
root,xr>
,H1,Hr};
(4)(D1,{H1})是一棵符合本定义的二叉树,称为根的左子树,是一棵符合本定义的二叉树,称为根的右子树。
基本操作P:
InitBiTree(&
T);
操作结果:
构造空二叉树T。
DestroyBiTree(&
初始条件:
二叉树T存在。
销毁二叉树T。
CreateBiTree(&
T,definition);
definition给出二叉树T的定义。
按definition构造二叉树T。
ClearBiTree(&
将二叉树T清为空树。
BiTreeEmpty(T);
若T为空二叉树,则返回TURE,否则FALSE。
BiTreeDepth(T);
返回T的深度。
Root(T);
返回T的根。
Value(T,e);
二叉树T存在,e是T中的某个结点。
返回e的值。
Assign(T,&
e,value);
初始条件:
操作结果:
结点e赋值为value。
Parent(T,e);
若e是T的非跟结点,则返回它的双亲,否则返回“空”。
LeftChild(T,e);
返回e的左孩子。
若e无左孩子,则返回“空”。
RightChild(T,e);
返回e的右孩子。
若e无右孩子,则返回“空”。
LeftSibling(T,e);
返回e的左兄弟。
若e无左孩子或无左兄弟,则返回“空”。
RightSibling(T,e);
返回e的右兄弟。
若e无右孩子或无右兄弟,则返回“空”。
}ADTBinaryTree
2.存储结构:
采用无头结点的链式存储结构实现
3.源代码:
头文件及存储结构:
#include<
stdio.h>
stdlib.h>
#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));
p)//存储分配失败
exit(OVERFLOW);
p->
data=e;
Q.rear->
next=p;
Q.rear=p;
intDeQueue(LinkQueue&
Q,QElemType&
e)//删除队头元素
if(Q.front==Q.rear)//队列为空队
returnERROR;
p=Q.front->
next;
e=p->
data;
next=p->
if(Q.rear==p)//判断删除队头元素后,队列是否为空队
Q.rear=Q.front;
free(p);
intQueueEmpty(LinkQueueQ)//判断队列是否为空队
if(Q.front==Q.rear)
returnTURE;
else
returnFALSE;
}
intInitBiTree(BiTree&
T)//构造空二叉树
T=NULL;
intDestroyTree(BiTree&
T)//销毁二叉树
T)
DestroyTree(T->
lchild);
rchild);
free(T);
T=NULL;
returnOK;
voidCreateBiTree(BiTree&
T)//用先序遍历的方式构建二叉树,以‘@’表示空结点。
TElemTypech;
scanf("
%c"
&
ch);
if(ch=='
@'
)
{
if(!
(T=(BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
//分配存储空间失败
T->
data=ch;
CreateBiTree(T->
//构造左子树
//构造右子树
}
intClearBiTree(BiTree&
T)//清空二叉树函数
ClearBiTree(T->
intBiTreeEmpty(BiTreeT)//判断二叉树是否为空
intBiTreeDepth(BiTreeT)//计算二叉树深度
intlcd,rcd;
return0;
lcd=BiTreeDepth(T->
rcd=BiTreeDepth(T->
return((lcd>
rcd?
lcd:
rcd)+1);
TElemTypeRoot(BiTreeT)//判断二叉树是否空,若非空返回其根
if(BiTreeEmpty(T))
returnNULL;
return(T->
data);
TElemTypeValue(BiTreeT,BiTreee)//返回e结点的值
returne->
intAssign(BiTreeT,BiTree&
e,TElemTypevalue)//将value的值给结点e
e->
data=value;
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&
rchild->
data==e)//找到e
returna->
//返回双亲的值
else
{
if(a->
lchild)
EnQueue(q,a->
//入队列左孩子
rchild)
//入队列右孩子
}
}
returnNULL;
BiTreePoint(BiTreeT,TElemTypes)//返回二叉树T中指向元素值为S的结点指针
QueueEmpty(q))
DeQueue(q,a);
data==s)
returna;
EnQueue(q,a->
TElemTypeLeftChild(BiTreeT,TElemTypee)
{//返回e的左孩子
BiTreea;
a=Point(T,e);
//a是指向结点e的指针
if(a&
returna->
TElemTypeRightChild(BiTreeT,TElemTypee)//返回e的右孩子
if((a=Point(T,e))&
TElemTypeLeftSibling(BiTreeT,TElemTypee)
{//返回左兄弟
TElemTypea;
BiTreep;
a=Parent(T,e);
//a为e的双亲
if(a!
=NULL)
p=Point(T,a);
//p指向结点a的指针
if(p->
p->
data==e)//p存在左右孩子而且右孩子是e
returnp->
TElemTypeRightSibling(BiTreeT,TElemTypee)
{//返回右兄弟
data==e)//p存在左右孩子而且左孩子是e
returnp->
intInsertChild(BiTreeT,BiTreep,intLR,BiTreec)//根据LR为0或者1,插入C为T中P所指结点的左或者右子树,
//P所指的结点原有左或右子树则成为C的右子树
if(p)
if(LR==0)//把二叉树C插入p所指结点的左子树
c->
rchild=p->
lchild;
p->
lchild=c;
else
rchild;
rchild=c;
returnERROR;
intDeleteChild(BiTreeT,BiTreep,intLR)
if(LR==0)
ClearBiTree(p->
voidvisit(TElemTypee)//二叉树结点访问函数
printf("
e);
intPreOrderTraverse(BiTreeT,void(*visit)(TElemType))//先序遍历二叉树
visit(T->
PreOrderTraverse(T->
lchild,visit);
rchild,visit);
intInOrderTraverse(BiTreeT,void(*visit)(TElemType))
{//中序遍历二叉树
InOrderTraverse(T->
intPostOrderTraverse(BiTreeT,void(*visit)(TElemType))
{//后序遍历二叉树
{
PostOrderTraverse(T->
intLevelOrderTraverse(BiTreeT,void(*visit)(TElemType))
{//层序遍历二叉树
//初始化队列
//根指针入队
//出队元素,赋给a
visit(a->
//访问a所指结点
lchild!
rchild!
主函数:
intmain()
inti,j,LR;
TElemTypevalue,a,temp;
BiTreep,C;
欢迎使用本二叉树程序,请按回车键继续...\n"
);
getchar();
正在构造空二叉树,请稍候..."
\n"
BiTreeT;
InitBiTree(T);
printf("
构造空二叉树成功!
构造空二叉树失败!
请按先序遍历顺序输入二叉树各结点的值!
空结点用@表示!
CreateBiTree(T);
请选择接下来的操作:
输入“1”为查看二叉树深度,输入“2”为查看二叉树根节点...\n"
%d"
i);
if(i==1)
此二叉树的深度为:
%d\n\n"
BiTreeDepth(T));
if(i==2)
此二叉树的根节点为:
%c\n\n"
Root(T));
请选择遍历该二叉树的顺序:
输入“1”为先序遍历,输入“2”为中序遍历,输入“3”为后序遍历,输入“4”为层序遍历...\n"
j=PreOrderTraverse(T,visit);
if(j==0)
该二叉树为空树,请重新运行程序!
j=InOrderTraverse(T,visit);
if(i==3)
j=PostOrderTraverse(T,visit);
if(i==4)
j=LevelOrderTraverse(T,visit);
\n请输入需要替换的结点:
a);
p=Point(T,a);
请输入需要代入的结点值:
value);
Assign(T,p,value);
赋值之后该结点的值为:
p->
请输入“1”求该结点的双亲结点,输入“2”求该结点的左孩子,输入“3”求该结点的右孩子,输入“4”求该结点的左兄弟,输入“5”求该结点的右兄弟..\n\n"
switch(i)
case1:
if(Parent(T,value)==NULL)
printf("
该结点没有双亲结点。
else
该结点的双亲结点为:
Parent(T,value));
break;
case2:
if(LeftChild(T,value)==NULL)
该结点没有左孩子结点。
该结点的左孩子结点为:
LeftChild(T,value));
case3:
if(RightChild(T,value)==NULL)
该结点没有右孩子结点。
该结点的右孩子结点为:
RightChild(T,value));
case4:
if(LeftSibling(T,value)==NULL)
该结点没有左兄弟。
该结点的左兄弟为:
LeftSibling(T,value));
break;
case5:
if(RightSibling(T,value)==NULL)
该结点没有右兄弟。
该结点的右兄弟为:
RightSibling(T,value));
\n现在进行结点插入子树,请按照先序遍历的顺序输入二叉树C,注意该二叉树没有右子树!
InitBiTree(C);
CreateBiTree(C);
\n请输入您需要插入子树的结点:
\n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 广东工业大学 数据结构 二叉 课程设计