当前位置:文档之家› 数据结构实验8实验报告

数据结构实验8实验报告

暨南大学本科实验报告专用纸课程名称数据结构实验成绩评定实验项目名称习题6.37 6.38 6.39 指导教师孙世良实验项目编号实验8 实验项目类型实验地点实验楼三楼机房学生姓名林炜哲学号2013053005学院电气信息学院系专业软件工程实验时间年月日午~月日午温度℃湿度(一)实验目的熟悉和理解二叉树的结构特性;熟悉二叉树的各种存储结构的特点及适用范围;掌握遍历二叉树的各种操作及其实现方式。

理解二叉树线索化的实质是建立结点与其在相应序列中的前去或后继之间的直接联系,熟练掌握二叉树的线索化的过程以及在中序线索化树上找给定结点的前驱和后继的方法。

(二)实验内容和要求6.37试利用栈的基本操作写出先序遍历的非递归形式的算法。

6.38同题6.37条件,写出后序遍历的非递归算法(提示:为分辨后序遍历时两次进栈的不同返回点需在指针进栈时同时将一个标志进栈)。

6.39假设在二叉链表的结点中增设两个域:双亲域以指示其双亲结点;标志域以区分在遍历过程中到达该结点时应继续向左或向右或访问该节点。

试以此存储结构编写不用栈进行后序遍历的递推形式的算法。

(三)主要仪器设备实验环境:Microsoft Visual Studio 2012(四)源程序6.37:#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define TRUE 1#define FALSE 0typedef struct bitnode{char data;struct bitnode *lchild,*rchild;}bitnode,*bitree;void create(bitree &T){char t;t=getchar();if(t==' ')T=NULL;else{if( !( T=(bitnode*)malloc(sizeof(bitnode)) ) ) exit(0);T->data=t;create(T->lchild);create(T->rchild);}}typedef struct{bitree *base;bitree *top;int stacksize;}sqstack;void initstack(sqstack &S){S.base=(bitree*)malloc(STACK_INIT_SIZE *sizeof(bitree));if(!S.base) exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;}void Push(sqstack &s,bitree e){if(s.top - s.base >= s.stacksize){s.base =(bitree*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));if(!s.base) exit(0);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;}bitree Pop(sqstack &s){if(s.top==s.base){printf("ERROR");exit(0);}return * --s.top;}int StackEmpty(sqstack s){if(s.top==s.base)return TRUE;elsereturn FALSE;}void PreOrderUnrec(bitree t){sqstack s;initstack(s);bitree p=t;while (p!=NULL || !StackEmpty(s)){while (p!=NULL) //遍历左子树{printf("%c",p->data);Push(s,p);p=p->lchild;}if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历{p=Pop(s);p=p->rchild;}//endif}//endwhile}int main(){bitree x;printf("以先序遍历的方法创建二叉树:");create(x);printf("利用栈对二叉树进行先序遍历并输出:");PreOrderUnrec(x);return 0;}6.38:#include<stdio.h>#include<stdlib.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define TRUE 1#define FALSE 0typedef struct bitnode{char data;struct bitnode *lchild,*rchild;}bitnode,*bitree;void create(bitree &T){char t;t=getchar();if(t==' ')T=NULL;else{if( !( T=(bitnode*)malloc(sizeof(bitnode)) ) ) exit(0);T->data=t;create(T->lchild);create(T->rchild);}}typedef struct{bitree *base;bitree *top;int stacksize;}sqstack;void initstack(sqstack &S){S.base=(bitree*)malloc(STACK_INIT_SIZE *sizeof(bitree));if(!S.base) exit(0);S.top=S.base;S.stacksize=STACK_INIT_SIZE;}void Push(sqstack &s,bitree e){if(s.top - s.base >= s.stacksize){s.base =(bitree*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(bitree));if(!s.base) exit(0);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;}*s.top++=e;}bitree Pop(sqstack &s){if(s.top==s.base){printf("ERROR");exit(0);}return * --s.top;}int StackEmpty(sqstack s){if(s.top==s.base)return TRUE;elsereturn FALSE;}void InOrderUnrec(bitree t){sqstack s;initstack(s);bitree p=t;while (p!=NULL || !StackEmpty(s)){while (p!=NULL&&tag==0) //遍历左子树 {Push(s,p);Push(s,NULL); //插入标志p=p->lchild;}//endwhileif (!StackEmpty(s)){p=Pop(s);if(p==NULL){p=Pop(s);Push(s,p);p=p->rchild;tag=0;}else{printf("%c",p->data);tag=1;if (StackEmpty(s)) break;}}//endif}//endwhile}int main(){bitree x;printf("以先序遍历的方法创建二叉树:");create(x);printf("利用栈对二叉树进行后序遍历:");InOrderUnrec(x);return 0;}6.39:#include<stdio.h>#include<stdlib.h>typedef struct bitnode{char data;struct bitnode *parent,*lchild,*rchild;}bitnode,*bitree;void create(bitree &T){char t;t=getchar();if(t==' ')T=NULL;else{T->lchild=(bitnode*)malloc(sizeof(bitnode));T->rchild=(bitnode*)malloc(sizeof(bitnode));T->data=t;T->mark=0;T->lchild->parent=T;T->rchild->parent=T;create(T->lchild);create(T->rchild);}}void postorder(bitree t){bitree p=t;while(p!=NULL)switch(p->mark){case 0:p->mark=1;if(p->lchild) p=p->lchild;break;case 1:p->mark=2;if(p->rchild) p=p->rchild;break;case 2:p->mark=0;putchar(p->data);p=p->parent;break;default:;}}int main(){bitree y;y=(bitnode*)malloc(sizeof(bitnode));y->parent=NULL;create(y);postorder(y);return 0;}(五)数据调试6.37:6.38:6.39:(六)实验结果分析与总结6.37:以先序遍历的方式输入二叉树:-+a *b -c d /e f ,输出-+a*b-cd/ef, 符合先序遍历访问顺序,程序运行正确。

6.38:以先序遍历的方式输入二叉树:-+a *b -c d /e f ,输出abcd-*+ef/-, 符合后序遍历访问顺序,程序运行正确。

相关主题