数学与计算机学院计算机系实验报告课程名称: 数据结构年级:2010 实验成绩: 指导教师: 黄襄念姓名: 实验教室:6A-413 实验名称:二叉树前序或中序或后序遍历学号: 实验日期:2012/6/10 实验序号:实验3实验时间:8:00—11:40 实验学时:4 一、实验目的1. 熟悉的掌握树的创建,和树的前序、中序、后序遍历。
二、实验环境1. 操作系统:Windows72. 开发软件:Microsoft Visual C++ 6.0三、实验内容● 程序功能本程序完成了以下功能:1. 前序遍历2. 中序遍历3. 后序遍历● 数据结构本程序中使用的数据结构(若有多个,逐个说明):1. 它的优缺点1) 可以快速的查找数据。
2) 让数据层次更加清晰。
2. 逻辑结构图3. 存储结构图、、、、、、、、、、、、、、、、、、、、4.存储结构的C/C++ 语言描述typedef struct node {DataType data;struct node *lchild;struct node *rchild;} BiTNode, *BiTree;typedef BiTree type;●算法描述本程序中采用的算法1.算法名称:递归2.算法原理或思想是通过访问结点的左右孩子来进行循环查找的方法,拿中序遍历来说明:先从头结点开始,再去访问头结点的右孩子如果为空就访问头结点的左孩子,依次进行访问当结点的左右孩子都为空时,就访问上一级,到了最后。
3.算法特点它能将查找进行2分,体现出了更高效快捷的特点,并且层次很清晰。
●程序说明1.2.1)前序遍历模块:将树进行从头结点开始再左孩子再右孩子。
代码:void InOrder(BiTree root){Stack S(100);initStack(S);BiTNode *p = root;do{while(p != NULL){Push(S, p);p = p->lchild;}if(!isEmpty(S)){Pop(S, p);cout << p->data << " ";p = p->rchild;}} while(p != NULL || !isEmpty(S));cout << endl;}2)后序遍历模块:将树进行从左孩子开始再右孩子再头结点。
代码:void PostOrder(BiTree root){Stack S(100);Stack SS(100);initStack(S);initStack(SS);BiTNode *p = root;do{while(p != NULL){Push(S, p);Push(SS, p);p = p->rchild;}if(!isEmpty(S)){Pop(S, p);p = p->lchild;}} while(p != NULL || !isEmpty(S));while(!isEmpty(SS)){Pop(SS, p);cout << p->data << " ";}cout << endl;}3)中序遍历模块:将树进行从左孩子开始再头结点再右孩子。
代码:void PreOrder(BiTree root){Stack S(100);initStack(S);BiTNode *p = root;do{while(p != NULL){Push(S, p);cout << p->data << " ";p = p->lchild;}if(!isEmpty(S)){Pop(S, p);p = p->rchild;}} while(p != NULL || !isEmpty(S));cout << endl;}四、调试与运行1. 程序调试本程序开发过程中,采用的调试方法或手段如下:1)方法1:在程序执行的终止的函数中加一条输出语句cout<<”*******”<<endl;进行错误的定位,调试了指针没有正确使用的错误。
2)方法2:输出一些树中的数据,看能不能正确的输出,调试了其左右孩子是不是正确。
2. 运行结果本次实验多个功能需分别截图,逐个说明。
运行结果图1……五、实验总结1. 结果分析:本程序完成了树的前序遍历、中序遍历、后序遍历功能;但是还是存在不完善的地方,没有对结点进行删除增加等操作,没有将树的结构给输出。
2. 心得体会:通过这个实验我更熟练的掌握了二叉树的结构同时也更了解了递归算法,觉得数据结构是一个很不错的一门课程。
代码:#include <iostream>#include <stack>using namespace std;using std::cout;using std::endl;typedef char DataType;typedef struct node {DataType data;struct node *lchild;struct node *rchild;} BiTNode, *BiTree;typedef BiTree type;class Stack{friend void initStack(Stack &S);friend bool isEmpty(Stack &S);friend bool Push(Stack &S, type x);friend bool Pop(Stack &S, type &x);friend bool getTop(Stack &S, type &x);public:Stack(int maxSize){if(maxSize < 0){throw std::exception("argument maxSize is illegal.");}this->maxSize = maxSize;this->s = NULL;}virtual ~Stack(){if(this->s != NULL){delete this->s;this->s = NULL;}}protected:int maxSize;std::stack<type> *s;};void initStack(Stack &S){if(S.s != NULL){delete S.s;S.s = NULL;}S.s = new std::stack<type>();}bool isEmpty(Stack &S){return S.s->empty();}bool Push(Stack &S, type x){if(S.s->size() == S.maxSize){return false;}S.s->push(x);return true;}bool Pop(Stack &S, type &x){if(S.s->empty()){return false;}x = S.s->top();S.s->pop();return true;}bool getTop(Stack &S, type &x){if(S.s->empty()){return false;}x = S.s->top();return true;}void PreOrder(BiTree root){Stack S(100);initStack(S);BiTNode *p = root;do{while(p != NULL){Push(S, p);cout << p->data << " ";p = p->lchild;}if(!isEmpty(S)){Pop(S, p);p = p->rchild;}} while(p != NULL || !isEmpty(S));cout << endl;}void InOrder(BiTree root){Stack S(100);initStack(S);BiTNode *p = root;do{while(p != NULL){Push(S, p);p = p->lchild;}if(!isEmpty(S)){Pop(S, p);cout << p->data << " ";p = p->rchild;}} while(p != NULL || !isEmpty(S));cout << endl;}void PostOrder(BiTree root){Stack S(100);Stack SS(100);initStack(S);initStack(SS);BiTNode *p = root;do{while(p != NULL){Push(S, p);Push(SS, p);p = p->rchild;}if(!isEmpty(S)){Pop(S, p);p = p->lchild;}} while(p != NULL || !isEmpty(S));while(!isEmpty(SS)){Pop(SS, p);cout << p->data << " ";}cout << endl;}void menu(){cout<<"**************************************"<<endl;cout<<"***** 1.中序遍历*****"<<endl;cout<<"***** 2.前序遍历*****"<<endl;cout<<"***** 3.后序遍历*****"<<endl;cout<<"***** 0.退出程序*****"<<endl;cout<<"**************************************"<<endl; }int main(int argc, char* argv[]){BiTNode nodes[7];int i;nodes[0].data = 'A';nodes[0].lchild = &nodes[1];nodes[0].rchild = NULL;nodes[1].data = 'B';nodes[1].lchild = &nodes[2];nodes[1].rchild = &nodes[3];nodes[2].data = 'C';nodes[2].lchild = NULL;nodes[2].rchild = NULL;nodes[3].data = 'D';nodes[3].lchild = &nodes[4];nodes[3].rchild = &nodes[5];nodes[4].data = 'E';nodes[4].lchild = NULL;nodes[4].rchild = &nodes[6];nodes[5].data = 'F';nodes[5].lchild = NULL;nodes[5].rchild = NULL;nodes[6].data = 'G';nodes[6].lchild = NULL;nodes[6].rchild = NULL;try{menu();cout<<"树已经生成了!"<<endl;while(1){cout<<"请输入你的选择:"<<endl;cin>>i;switch(i){case 1:PreOrder(nodes);break;case 2:InOrder(nodes);break;case 3:PostOrder(nodes);break;case 0:exit(0);}}}catch(std::exception &e){cout << e.what();}return 0;}。