1、实验6塔里木大学实验报告课程名称:数据结构任课教师:化希耀机 房:逸209计算机编号:22实验日期:2014-10-22实验成绩:实验班级:计算机17-6学生姓名:崔顺林实验名称:实验6 树的操作实验目的:一、 实验内容:#include #include #define MAXSIZE 100#define NULL 0#define OK 1#define ERROR 0typedef int Status;typedef char ElemType;typedef struct Node ElemType data; struct Node *lchild,*rchild;BiTNode
2、,*BiTree,*QElemType,*SElemType;typedef struct ElemType dataMaxSize; int front,rear; /队首和队尾指针 SqQueue;void InitQueue(SqQueue *&q) /初始化队列 q=(SqQueue *)malloc (sizeof(SqQueue); q-front=q-rear=0;void DestroyQueue(SqQueue *&q) /销毁队列 free(q);bool QueueEmpty(SqQueue *q) /判断队列空 return(q-front=q-rear);bool e
3、nQueue(SqQueue *&q,ElemType e) /进队 if (q-rear+1)%MaxSize=q-front) /队满上溢出 return false; q-rear=(q-rear+1)%MaxSize; q-dataq-rear=e; return true;bool deQueue(SqQueue *&q,ElemType &e) /出队 if (q-front=q-rear) /队空下溢出 return false; q-front=(q-front+1)%MaxSize; e=q-dataq-front; return true;void InitBiTree(B
4、iTree *T) *T=NULL;void DestroyBiTree(BiTree *T) /*销毁二叉树*/ if(*T) if(*T)-lchild) DestroyBiTree(&(*T)-lchild); if(*T)-rchild) DestroyBiTree(&(*T)-rchild); free(*T); *T=NULL; void Visit(ElemType e) /*访问结点e*/ printf(%c,e);void PreOrder(BiTree T) /*先序遍历二叉树*/ if(T) Visit(T-data); PreOrder(T-lchild); PreOr
5、der(T-rchild); void InOrder(BiTree T) /*中序遍历二叉树*/ if(T) InOrder(T-lchild); Visit(T-data); InOrder(T-rchild); void PostOrder(BiTree T) /*后序遍历二叉树*/ if(T) PostOrder(T-lchild); PostOrder(T-rchild); Visit(T-data); void CreateBiTree(BiTree *T) ElemType ch; scanf(%c,&ch); if(ch=#) *T=NULL; return; else *T=
6、(BiTree)malloc(sizeof(BiTNode); (*T)-data=ch; CreateBiTree(&(*T)-lchild); CreateBiTree(&(*T)-rchild); BiTree CreateBiTree() BiTree T; ElemType ch; scanf(%c,&ch); if(ch=#) return NULL; else T=(BiTree)malloc(sizeof(BiTNode); T-data=ch; T-lchild=CreateBiTree(); T-rchild=CreateBiTree(); return T; Status
7、 BiTreeEmpty(BiTree T) /*判断二叉树是否为空*/ if(T) return ERROR; else return OK;int BiTreeDepth(BiTree T) /*求二叉树的深度*/ int i,j; if(!T) return 0; if(T-lchild) i=BiTreeDepth(T-lchild); else i=0; if(T-rchild) j=BiTreeDepth(T-rchild); else j=0; return ij?i+1:j+1;void LevelOrder(BiTree T) /*层次遍历二叉树*/ SeqQueue q;
8、QElemType a; 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); ElemType Parent(BiTree T,ElemType e) /*求e的双亲*/ SeqQueue q; QElemType a; if(T) InitQueue(&q); EnterQ
9、ueue(&q,T); while(!QueueEmpty(q) DeleteQueue(&q,&a); if(a-lchild&a-lchild-data=e|a-rchild&a-rchild-data=e) return a-data; else if(a-lchild) EnterQueue(&q,a-lchild); if(a-rchild) EnterQueue(&q,a-rchild); return NULL;BiTree Point(BiTree T,ElemType s) /*返回指向结点s的指针*/SeqQueue q;QElemType a;if(T) InitQueu
10、e(&q); EnterQueue(&q,T); while(!QueueEmpty(q) DeleteQueue(&q,&a); if(a-data=s) return a; if(a-lchild) EnterQueue(&q,a-lchild); if(a-rchild) EnterQueue(&q,a-rchild); return NULL;ElemType LeftChild(BiTree T,ElemType e) /*返回结点e的左孩子*/ QElemType a; if(T) a=Point(T,e); if(a&a-lchild) return a-lchild-data;
11、 return NULL;void InOrder1(BiTree T) /*中序遍历二叉树的非递归算法*/ SeqStack s; 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);void PreOrder1(BiTree T) /*先序遍历二叉树的非递归算法*/ SeqStack s; InitStack(&s); while(T|!StackEmpty(s) if(T) Visit(T-data
12、); Push(&s,T); T=T-lchild; else Pop(&s,&T); T=T-rchild; printf(n);void PrintLeaf(BiTree T) /*输出叶子结点*/ if(T) if(!T-lchild&!T-rchild) printf(%c,T-data); PrintLeaf(T-lchild); PrintLeaf(T-rchild); int Leaf(BiTree T) /*统计叶子结点的个数*/int leafcount=0;if(!T) leafcount=0;else if(!T-lchild&!T-rchild) leafcount=1
13、;else leafcount=Leaf(T-lchild)+Leaf(T-rchild);return leafcount;void SwapChild(BiTree T) /*交换左右子树*/ 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); int Menu()/*菜单函数*/int c,d;BiTree T;ElemType e;while(1)printf(*Menu*n);printf
14、(1.CreateBiTreen);printf(2.PreOrdern);printf(3.InOrdern);printf(4.PostOrdern);printf(5.LevelOrdern);printf(6.BiTreeDepthn);printf(7.Parentn);printf(8.LeftChildn);printf(9.InOrder1n);printf(10.PrintLeafn);printf(11.LeafCountn);printf(12.SwapChildn);printf(13.PreOrder1n);printf(15.Exitn);printf(*n);pr
15、intf(n);printf(n);printf(Please select a choice:);scanf(%d,&c);if(c15) printf(%c invalid choicen,c);exit(0);else switch(c) case 1: break; case 2: PreOrder(T); printf(n); break; case 3: InOrder(T); printf(n); break; case 4: PostOrder(T); printf(n); break; case 5: LevelOrder(T); break; case 6: printf(
16、The depth of the BiTree is:%d.n,BiTreeDepth(T); break; case 7: printf(please enter elem:); e=getchar(); scanf(%c,&e); printf(Parent is %cn,Parent(T,e); break; case 8: printf(please enter elem:); e=getchar(); scanf(%c,&e); printf(LeftChild is %cn,LeftChild(T,e); break; case 9: InOrder1(T); break; cas
17、e 10: PrintLeaf(T); printf(n); break; case 11: printf(%dn,Leaf(T); break; case 12: SwapChild(T); break; case 13: PreOrder1(T); break; case 15:exit(0); BiTree T;void main()clrscr();CreateBiTree(&T);Menu();实验分析及总结通过这次试验,我掌握了数据结构中有关于树的一些操作。知道了怎么样由C语言来实现对二叉树的操作,以及求二叉树的深度的操作,还有二叉树的叶子的个数,知道了基本的二叉树的前序,中序和后序。只要认真做好每一次实验,认真对待每一个实验中的困难,那么你会发现每个实验都是一个乐趣。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1