实验6.docx
《实验6.docx》由会员分享,可在线阅读,更多相关《实验6.docx(16页珍藏版)》请在冰豆网上搜索。
实验6
塔里木大学实验报告
课程名称:
数据结构
任课教师:
化希耀
机房:
逸209
计算机编号:
22
实验日期:
2014-10-22
实验成绩:
实验班级:
计算机17-6
学生姓名:
崔顺林
实验名称:
实验6树的操作
实验目的:
一、实验内容:
#include
#include
#defineMAXSIZE100
#defineNULL0
#defineOK1
#defineERROR0
typedefintStatus;
typedefcharElemType;
typedefstructNode
{
ElemTypedata;
structNode*lchild,*rchild;
}BiTNode,*BiTree,*QElemType,*SElemType;
typedefstruct
{
ElemTypedata[MaxSize];
intfront,rear;//队首和队尾指针
}SqQueue;
voidInitQueue(SqQueue*&q)//初始化队列
{q=(SqQueue*)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
voidDestroyQueue(SqQueue*&q)//销毁队列
{
free(q);
}
boolQueueEmpty(SqQueue*q)//判断队列空
{
return(q->front==q->rear);
}
boolenQueue(SqQueue*&q,ElemTypee)//进队
{
if((q->rear+1)%MaxSize==q->front)//队满上溢出
returnfalse;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
returntrue;
}
booldeQueue(SqQueue*&q,ElemType&e)//出队
{
if(q->front==q->rear)//队空下溢出
returnfalse;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
returntrue;
}
voidInitBiTree(BiTree*T)
{
*T=NULL;
}
voidDestroyBiTree(BiTree*T)/*销毁二叉树*/
{
if(*T)
{
if((*T)->lchild)
DestroyBiTree(&(*T)->lchild);
if((*T)->rchild)
DestroyBiTree(&(*T)->rchild);
free(*T);
*T=NULL;
}
}
voidVisit(ElemTypee)/*访问结点e*/
{
printf("%c",e);
}
voidPreOrder(BiTreeT)/*先序遍历二叉树*/
{
if(T)
{
Visit(T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
voidInOrder(BiTreeT)/*中序遍历二叉树*/
{
if(T)
{
InOrder(T->lchild);
Visit(T->data);
InOrder(T->rchild);
}
}
voidPostOrder(BiTreeT)/*后序遍历二叉树*/
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T->data);
}
}
voidCreateBiTree(BiTree*T)
{
ElemTypech;
scanf("%c",&ch);
if(ch=='#')
{*T=NULL;return;}
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
(*T)->data=ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
BiTreeCreateBiTree()
{
BiTreeT;
ElemTypech;
scanf("%c",&ch);
if(ch=='#')
returnNULL;
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
returnT;
}
}
StatusBiTreeEmpty(BiTreeT)/*判断二叉树是否为空*/
{
if(T)
returnERROR;
else
returnOK;
}
intBiTreeDepth(BiTreeT)/*求二叉树的深度*/
{
inti,j;
if(!
T)
return0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
returni>j?
i+1:
j+1;
}
voidLevelOrder(BiTreeT)/*层次遍历二叉树*/
{
SeqQueueq;
QElemTypea;
if(T)
{
InitQueue(&q);
EnterQueue(&q,T);
while(!
QueueEmpty(q))
{
DeleteQueue(&q,&a);
Visit(a->data);
if(a->lchild!
=NULL)
EnterQueue(&q,a->lchild);
if(a->rchild)
EnterQueue(&q,a->rchild);
}
printf("\n");
}
}
ElemTypeParent(BiTreeT,ElemTypee)/*求e的双亲*/
{
SeqQueueq;
QElemTypea;
if(T)
{
InitQueue(&q);
EnterQueue(&q,T);
while(!
QueueEmpty(q))
{
DeleteQueue(&q,&a);
if(a->lchild&&a->lchild->data==e||a->rchild&&a->rchild->data==e)
returna->data;
else
{
if(a->lchild)
EnterQueue(&q,a->lchild);
if(a->rchild)
EnterQueue(&q,a->rchild);
}
}
}
returnNULL;
}
BiTreePoint(BiTreeT,ElemTypes)/*返回指向结点s的指针*/
{
SeqQueueq;
QElemTypea;
if(T)
{
InitQueue(&q);
EnterQueue(&q,T);
while(!
QueueEmpty(q))
{
DeleteQueue(&q,&a);
if(a->data==s)
returna;
if(a->lchild)
EnterQueue(&q,a->lchild);
if(a->rchild)
EnterQueue(&q,a->rchild);
}
}
returnNULL;
}
ElemTypeLeftChild(BiTreeT,ElemTypee)/*返回结点e的左孩子*/
{
QElemTypea;
if(T)
{
a=Point(T,e);
if(a&&a->lchild)
returna->lchild->data;
}
returnNULL;
}
voidInOrder1(BiTreeT)/*中序遍历二叉树的非递归算法*/
{
SeqStacks;
InitStack(&s);
while(T||!
StackEmpty(s))
{
if(T)
{
Push(&s,T);
T=T->lchild;
}
else
{
Pop(&s,&T);
Visit(T->data);
T=T->rchild;
}
}
printf("\n");
}
voidPreOrder1(BiTreeT)/*先序遍历二叉树的非递归算法*/
{
SeqStacks;
InitStack(&s);
while(T||!
StackEmpty(s))
{
if(T)
{
Visit(T->data);
Push(&s,T);
T=T->lchild;
}
else
{
Pop(&s,&T);
T=T->rchild;
}
}
printf("\n");
}
voidPrintLeaf(BiTreeT)/*输出叶子结点*/
{
if(T)
{
if(!
T->lchild&&!
T->rchild)
printf("%c",T->data);
PrintLeaf(T->lchild);
PrintLeaf(T->rchild);
}
}
intLeaf(BiTreeT)/*统计叶子结点的个数*/
{
intleafcount=0;
if(!
T)
leafcount=0;
elseif(!
T->lchild&&!
T->rchild)
leafcount=1;
else
leafcount=Leaf(T->lchild)+Leaf(T->rchild);
returnleafcount;
}
voidSwapChild(BiTreeT)/*交换左右子树*/
{
BiTNode*p;
if(T)
{
if(T->lchild||T->rchild)
{p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
}
SwapChild(T->lchild);
SwapChild(T->rchild);
}
}
intMenu()/*菜单函数*/
{
intc,d;
BiTreeT;
ElemTypee;
while
(1)
{
printf("*********Menu***************\n");
printf("1.CreateBiTree\n");
printf("2.PreOrder\n");
printf("3.InOrder\n");
printf("4.PostOrder\n");
printf("5.LevelOrder\n");
printf("6.BiTreeDepth\n");
printf("7.Parent\n");
printf("8.LeftChild\n");
printf("9.InOrder1\n");
printf("10.PrintLeaf\n");
printf("11.LeafCount\n");
printf("12.SwapChild\n");
printf("13.PreOrder1\n");
printf("15.Exit\n");
printf("***************************\n");
printf("\n");
printf("\n");
printf("Pleaseselectachoice:
");
scanf("%d",&c);
if(c<0||c>15)
{printf("%cinvalidchoice\n",c);exit(0);}
else
switch(c)
{case1:
break;
case2:
PreOrder(T);
printf("\n");
break;
case3:
InOrder(T);
printf("\n");
break;
case4:
PostOrder(T);
printf("\n");
break;
case5:
LevelOrder(T);
break;
case6:
printf("ThedepthoftheBiTreeis:
%d.\n",BiTreeDepth(T));
break;
case7:
printf("pleaseenterelem:
");
e=getchar();
scanf("%c",&e);
printf("Parentis%c\n",Parent(T,e));
break;
case8:
printf("pleaseenterelem:
");
e=getchar();
scanf("%c",&e);
printf("LeftChildis%c\n",LeftChild(T,e));
break;
case9:
InOrder1(T);
break;
case10:
PrintLeaf(T);
printf("\n");
break;
case11:
printf("%d\n",Leaf(T));
break;
case12:
SwapChild(T);
break;
case13:
PreOrder1(T);
break;
case15:
exit(0);
}
}
}
BiTreeT;
voidmain()
{
clrscr();
CreateBiTree(&T);
Menu();
}
实验分析及总结
通过这次试验,我掌握了数据结构中有关于树的一些操作。
知道了怎么样由C语言来实现对二叉树的操作,以及求二叉树的深度的操作,还有二叉树的叶子的个数,知道了基本的二叉树的前序,中序和后序。
只要认真做好每一次实验,认真对待每一个实验中的困难,那么你会发现每个实验都是一个乐趣。