实验6.docx

上传人:b****5 文档编号:29111953 上传时间:2023-07-20 格式:DOCX 页数:16 大小:16.69KB
下载 相关 举报
实验6.docx_第1页
第1页 / 共16页
实验6.docx_第2页
第2页 / 共16页
实验6.docx_第3页
第3页 / 共16页
实验6.docx_第4页
第4页 / 共16页
实验6.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实验6.docx

《实验6.docx》由会员分享,可在线阅读,更多相关《实验6.docx(16页珍藏版)》请在冰豆网上搜索。

实验6.docx

实验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语言来实现对二叉树的操作,以及求二叉树的深度的操作,还有二叉树的叶子的个数,知道了基本的二叉树的前序,中序和后序。

只要认真做好每一次实验,认真对待每一个实验中的困难,那么你会发现每个实验都是一个乐趣。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1