当前位置:文档之家› 数据结构 课程设计 排序二叉树

数据结构 课程设计 排序二叉树

学号数据结构课程设计设计说明书排序二叉树的遍历起止日期:2011 年12月12日至2011 年12月16日学生姓名班级成绩指导教师(签字)电子与信息工程系2011年12月16日天津城市建设学院课程设计任务书2011 —2012 学年第二学期电子与信息工程系软件工程专业班级课程设计名称:数据结构课程设计设计题目:排序二叉树的遍历完成期限:自2011 年12月12 日至2011 年12月16 日共 1 周设计依据、要求及主要内容(可另加附页):一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。

二、设计要求(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。

凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;(4)认真编写课程设计报告。

三、设计内容排序二叉树的遍历(用递归或非递归的方法都可以)1)问题描述输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。

2)基本要求(1)用菜单实现(2)能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列和叶子结点的数目。

四、参考文献1.王红梅.数据结构.清华大学出版社2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社指导教师(签字):教研室主任(签字):批准日期: 2011 年 12 月 17 日主要内容:一、需求分析:输入树的各个结点,建立排序二叉树,对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目。

我自己的思想:首先设想把源程序分成头文件,调用和主函数三部分。

在头文件中申明类和定义结构体,把先序,中序,后序,层次和叶子节点数的函数定义在类中。

然后在调用文件中,把几个函数的实现定义写在里面。

最后在主函数中把输出结果以菜单的样式输出来的方式写完主函数程序。

实现的过程是先想好自己要输入的是什么,然后通过输入节点制,判断其是否是满足前序遍历,满足则可以实现下后面的功能。

二、问题求解:现实中的问题:给同学排队问题。

层次是从头开始每一层一层的排,然后分别记号码。

前序是先从最上面的那一个开始往左手边开始排,排之前先计算好人数,然后开始排,排玩左边排右边。

中序是先从最左边开始,然后左斜上角,然后右下角,再左斜上角,直到最上层为止,然后安这个顺序继续排右边的。

后序是先从最左边开始的,左边的一次排过来,然后直接排右边的,也是安依次的顺序,最后才是最上层的。

三、总体设计:层次:前序:中序:后序:四、详细设计:BiSortTree( ); //构造函数,初始化一棵二叉树,其前序序列由键盘输入 BiNode<T>* Getroot(); //获得指向根结点的指针void PreOrder(BiNode<T> *root); //前序遍历二叉树void InOrder(BiNode<T> *root); //中序遍历二叉树void PostOrder(BiNode<T> *root); //后序遍历二叉树void LeverOrder(BiNode<T> *root); //层序遍历二叉树void leafnum(BiNode<T> *root); //求二叉树的叶子结点个数void empty( ); //判断二叉树是否为空int printnum( ); // 输出(全部、叶子或单分支)结点数BiNode<T> *root; //指向根结点的头指针BiNode<T> *Creat( ); //有参构造函数调用五、调试与测试:调试方法:在C++程序想调试的地方按F9,然后按F5开始调试。

测试结果与预想的正确。

测试过程中遇到的问题:输入的排序二叉树的输入顺序不对,导致输出结果与预计的不想符。

采取的措施:仔细回想几个遍历的过程,通过调试和查看程序是否错误,最后终于解决了错误的地方。

六、关键源程序清单和执行结果:注释问题都在程序中。

源程序://声明类BiSortTree及定义结构BiNode,文件名为bisorttree.h#ifndef BITREE_H#define BITREE_Hint num;template <class T>struct BiNode //二叉树排序的结点结构{T data;BiNode<T> *lchild, *rchild;};template <class T>class BiSortTree{public:BiSortTree( ); //构造函数,初始化一棵二叉排序树,其前序序列由键盘输入BiNode<T>* Getroot(); //获得指向根结点的指针void PreOrder(BiNode<T> *root); //前序遍历二叉排序树void InOrder(BiNode<T> *root); //中序遍历二叉排序树void PostOrder(BiNode<T> *root); //后序遍历二叉排序树void LeverOrder(BiNode<T> *root); //层序遍历二叉排序树void leafnum(BiNode<T> *root); //求二叉排序树的叶子结点个数void empty( ); //判断二叉排序树是否为空int printnum( ); // 输出叶子结点数private:BiNode<T> *root; //指向根结点的头指针BiNode<T> *Creat( ); //有参构造函数调用};#endif//定义类中的成员函数,文件名为bisorttree.cpp#include<iostream>#include<string>#include"bisorttree.h"using namespace std;/**前置条件:二叉排序树不存在*输入:无*功能:构造一棵二叉树*输出:无*后置条件:产生一棵二叉树*/template<class T>BiSortTree<T>::BiSortTree( ){//this->num=0;this->root = Creat( );}/**前置条件:二叉排序树已存在*输入:无*功能:获取指向二叉排序树根结点的指针 *输出:指向二叉排序树根结点的指针*后置条件:二叉排序树不变*/template<class T>BiNode<T>* BiSortTree<T>::Getroot( ) {return root;}/**前置条件:二叉排序树已存在*输入:无*功能:前序遍历二叉排序树*输出:二叉排序树中结点的一个线性排列 *后置条件:二叉排序树不变*/template<class T>void BiSortTree<T>::PreOrder(BiNode<T> *root){if(root==NULL) return;else{cout<<root->data<<" ";PreOrder(root->lchild);PreOrder(root->rchild);}}/**前置条件:二叉排序树已存在*输入:无*功能:中序遍历二叉排序树*输出:二叉排序树中结点的一个线性排列*后置条件:二叉排序树不变*/template <class T>void BiSortTree<T>::InOrder (BiNode<T> *root){if (root==NULL) return; //递归调用的结束条件else{InOrder(root->lchild); //中序递归遍历root的左子树 cout<<root->data<<" "; //访问根结点的数据域InOrder(root->rchild); //中序递归遍历root的右子树}}/**前置条件:二叉排序树已存在*输入:无*功能:后序遍历二叉排序树*输出:二叉排序树中结点的一个线性排列*后置条件:二叉排序树不变*/template <class T>void BiSortTree<T>::PostOrder(BiNode<T> *root){if (root==NULL) return; //递归调用的结束条件else{PostOrder(root->lchild); //后序递归遍历root的左子树 PostOrder(root->rchild); //后序递归遍历root的右子树 cout<<root->data<<" "; //访问根结点的数据域}}/**前置条件:二叉排序树已存在*输入:无*功能:层序遍历二叉排序树*输出:二叉排序树中结点的一个线性排列*后置条件:二叉排序树不变*/template <class T>void BiSortTree<T>::LeverOrder(BiNode<T> *root){const int MaxSize = 100;int front = 0;int rear = 0; //采用顺序队列,并假定不会发生上溢BiNode<T>* Q[MaxSize];BiNode<T>* q;if (root==NULL) return;else{Q[rear++] = root;while (front != rear){q = Q[front++];cout<<q->data<<" ";if (q->lchild != NULL) Q[rear++] = q->lchild;if (q->rchild != NULL) Q[rear++] = q->rchild;}}}/**前置条件:空二叉树*输入:数据ch;*功能:初始化一棵二叉排序树,构造函数调用*输出:无*后置条件:产生一棵二叉排序树*/template <class T>BiNode<T>* BiSortTree<T>::Creat( ){BiNode<T>* root;T ch;cout<<"请输入创建一棵二叉排序树的结点数据"<<endl;cin>>ch;if (ch=="#") root = NULL;else{root = new BiNode<T>; //生成一个结点root->data=ch;root->lchild = Creat( ); //递归建立左子树root->rchild = Creat( ); //递归建立右子树}return root;}/**前置条件:二叉排序树已经存在*输入:无*功能:求二叉排序树的叶子结点个数*输出:二叉排序树的叶子结点个数*后置条件:二叉排序树不变*/template<class T>void BiSortTree<T>::leafnum(BiNode<T> *root){if(root==NULL) return;else{if(!(root->lchild) && !(root->rchild)) //判断是否为叶子结点num++;leafnum(root->lchild); //左子树中的叶子结点个数leafnum(root->rchild); //右子树中的叶子结点个数}}/*将全局变量num初始化为*/template<class T>void BiSortTree<T>::empty( ){num=0;}/*输出全局变量num的值*/template<class T>int BiSortTree<T>::printnum( ){return num;}//二叉树的主函数,文件名为bisorttreemain.cpp#include<iostream>#include<string>#include"bisorttree.cpp"using namespace std;void main(){BiSortTree<string> bt; //创建一颗二叉排序树BiNode<string>* root = bt.Getroot( ); //获取指向根结点的指针int x=-1;while(x!=0){cout<<"1.前序遍历"<<endl;cout<<"2.中序遍历"<<endl;cout<<"3.后序遍历"<<endl;cout<<"4.层序遍历"<<endl;cout<<"5.叶子节点个数"<<endl;cout<<"0.退出"<<endl;cin>>x;switch(x){ case 1:cout<<"前序遍历为:"<<endl;bt.PreOrder(root);cout<<endl;break;case 2:cout<<"中序遍历为:"<<endl;bt.InOrder(root);cout<<endl;break;case 3:cout<<"后序遍历为:"<<endl;bt.PostOrder(root);cout<<endl;break;case 4:cout<<"层序遍历为:"<<endl;bt.LeverOrder(root);cout<<endl;break;case 5:bt.empty();bt.leafnum(root);cout<<"叶子结点个数为:"<<bt.printnum()<<endl;break;case 0:exit(0);} }}结果:。

相关主题