数据结构课程设计报告二叉排序树的实现
数据结构二叉排序树的实现(用顺序和二叉链表作存储结构)课程设计

一、设计题目1、题目:二叉排序树的实现 (用顺序和二叉链表作存储结构 )2、要求(功能):1) 以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;2) 对二叉排序树T作中序遍历,输出结果;3) 输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;二、需求分析建立排序二叉树,主要是建立节点来存储输入的数据,需要建立函数来创造排序二叉树。
该题目包括三方面的容:一个是二叉排序树的建立,而是二叉树的中序遍历,三是二叉树元素的查找并删除。
三、数据结构设计在写算法之前,应对数据结构进行设计。
本体主要会用到指针变量,插入节点函数和建立二叉树,以及中序遍历函数,还有一些输入输出语句。
四、算法设计算法设计思想二插链表作存储结构:建立二插排序树采用边查找边插入的方式。
查找函数采用递归的方式进行查找。
如果查找成功则不应再插入原树,否则返回当前结点的上一个结点。
然后利用插入函数将该元素插入原树。
对二叉树进行中序遍历采用递归函数的方式。
在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。
删除结点函数,采用边查找边删除的方式。
如果没有查找到,则不对树做任何的修改;如果查找到结点,则分四种情况分别进行讨论:1、该结点左右子树均为空;2、该结点仅左子树为空;3、该结点仅右子树为空;4、该结点左右子树均不为空。
在进行算法设计时,应将题目分为五个函数模块:1、中序遍历,符合升序输出void inorder(node *&root){if(root!=NULL){inorder(root->left);cout<<root->data<<' ';inorder(root->right);}}2、在查找树中插入元素void insert(node *&ptr,int item) {if(ptr==NULL)ptr=new node(item);else if(item<ptr->data)insert(ptr->left,item);else insert(ptr->right,item);}3、在查找树中查找元素node *find(node *&ptr,int item) {if(ptr==NULL)return NULL;if(ptr->data==item)return ptr;else if(item<ptr->data)find(ptr->left,item);else find(ptr->right,item); }4、在查找树中查找肯定存在的元素,并返回其引用node *&findy(node *&ptr,int item){if(ptr->data==item)return ptr;else if(item<ptr->data)findy(ptr->left,item);else findy(ptr->right,item);}node* rl(){return left;}node* rr(){return right;}5、删除指定值为所在结点void dele(node *&ptr)if(ptr->rl()==NULL&&ptr->rr()==NULL)ptr=NULL;else if(ptr->rr()==NULL)ptr=ptr->rl();elseptr=ptr->rr();}private:int data;node *left;node *right;};五、程序实现1、调入文件#include <iostream>2、主函数int main(){int t,i=0,j;cout<<" 10计科一班旭(1010311114)"<<endl;cout<<"1.二叉排序树T的输入:"<<endl;cout<<"输入数字个数(结点个数):";cin>>t;cout<<"输入"<<t<<"个数字,数字之间用空格隔开:"; cin>>j;node *x=new node(j);for(;i<t-1;i++){cin>>j;x->insert(x,j);}cout<<"中序遍历为:";x->inorder(x); //作中序遍历cout<<"\n";cout<<"2.二叉排序树T的元素查找和删除:"<<endl; cout<<"\n输入操作(当输入-1时程序结束):"<<endl; cin>>j;while(j!=-1){node *t=x->find(x,j); //定位结点if(t!=NULL){node *&y=x->findy(x,j);x->dele(y);cout<<"中序遍历为:";x->inorder(x);}else cout<<"无"<<j;cout<<"\n输入操作(当输入-1时程序结束):"<<endl;cin>>j;}return 0;}六、程序编码#include <iostream>using namespace std;class node{public:node(int i):data(i),left(NULL),right(NULL){}void inorder(node *&root) //中序遍历,符合升序输出{if(root!=NULL){inorder(root->left);cout<<root->data<<' ';inorder(root->right);}}void insert(node *&ptr,int item) //在查找树中插入元素{if(ptr==NULL)ptr=new node(item);else if(item<ptr->data)insert(ptr->left,item);else insert(ptr->right,item);}node *find(node *&ptr,int item) //在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
数据结构试验报告 二叉排序树的操作

数据结构实验报告班级:信息与计算科学专业1102班学号: 1108060214姓名:朱晓东设计日期:2013.6.6西安科技大学计算机学院1.实验报告编写一个演示运用二叉排序树进行数据的的排序、插入、删除、查找等操作的程序。
2.需求分析本演示程序用vc6.0编写,完成数据的排序功能,同时能够进行数据的创建、插入、删除、查找。
(1)输入的形式和输入值的范围:创建二叉排序树时输入较多的值;插入元素时需要输入插入的元素的值;删除元素时输入元素的值;查找操作时需要输入元素的值。
所有输入中,元素的值都是整数。
(2)输出的形式:在创建、插入、删除的操作后,均显示操作后的元素的排序状况,有小到大排序。
(3)程序所能达到的功能:完成二叉排序树的生成、插入、删除、查找操作。
(4)测试数据:①插入操作中依次输入10 9 11 8 12 0(本程序是以0元素为为结束标志);②查找操作中输入13;③插入操作中输入13;3概要设计本程序包含8个函数:(1)主函数main()(2)创建二叉排序树函数BSTCreate(BiTree* bt)(3)显示操作菜单函数menu()(4)显示二叉排序树的内容函数BSTShow(BiTree bt)(5)插入元素函数BSTInsert(BiTree* bt,DataType key)(6)删除元素函数BSTDelete(BiTree* bt,DataType key)(7)查找元素函数BSTSearch(BiTree bt,DataType key)(8)查找要删除的元素的函数DeleteNode(BiTree* bt)各函数之间的关系如下:BSTCreate(BiTree* bt)menu()BSTShow(BiTree bt)mainBSTInsert(BiTree* bt,DataType key)BSTDelete(BiTree* bt,DataType key) DeleteNode(BiTree* bt)BSTSearch(BiTree bt,DataType key)4.详细设计实现概要设计中定义的所有数据类型,对每个操作给出伪码算法。
二叉排序实现课程设计

二叉排序实现课程设计一、课程目标知识目标:1. 理解二叉排序树的基本概念,掌握其结构特点及操作原理;2. 学会使用二叉排序树进行数据排序,并掌握二叉排序树的插入、删除、查找等基本操作;3. 了解二叉排序树与其他排序算法的优缺点,明确其适用场景。
技能目标:1. 能够独立构建二叉排序树,进行数据的排序与查找;2. 能够分析并解决二叉排序树在实际应用中遇到的问题,如平衡二叉树、优化查找效率等;3. 能够运用所学知识,解决实际生活中的排序问题。
情感态度价值观目标:1. 培养学生的逻辑思维能力和问题解决能力,使其在面对复杂问题时,能够运用所学知识进行分析和解决;2. 增强学生的团队协作意识,通过小组讨论和实践,培养学生的沟通能力和合作精神;3. 激发学生的学习兴趣,使其在掌握二叉排序树的基础上,探索更多数据结构与算法的知识,为以后的学习打下坚实基础。
课程性质:本课程为数据结构与算法领域的基础课程,旨在帮助学生掌握二叉排序树的基本概念与操作方法,提高其编程实践能力。
学生特点:学生具备一定的编程基础,熟悉基本的数据结构和算法,但对二叉排序树的理解和应用尚浅。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析和动手实践,使学生深入理解二叉排序树,提高其编程水平。
同时,注重培养学生的逻辑思维和团队协作能力,提高其综合素质。
二、教学内容1. 引言:介绍排序算法在计算机科学中的应用,引出二叉排序树的概念及其重要性。
- 排序算法概述- 二叉排序树的基本概念2. 二叉排序树的构建与性质:- 二叉排序树的定义及结构- 二叉排序树的构建方法- 二叉排序树的性质与判定3. 二叉排序树的基本操作:- 插入操作- 删除操作- 查找操作- 遍历操作4. 二叉排序树的优化与应用:- 平衡二叉树的概念及实现- 二叉排序树在实际应用中的优化- 二叉排序树与其他排序算法的性能比较5. 实践与案例分析:- 动手实践:构建二叉排序树,实现基本操作- 案例分析:解决实际问题,分析二叉排序树的优缺点教学内容安排与进度:1. 引言与二叉排序树的构建:1课时2. 二叉排序树的基本操作:2课时3. 二叉排序树的优化与应用:2课时4. 实践与案例分析:3课时教材章节关联:1. 《数据结构与算法》第三章:树与二叉树2. 《数据结构与算法》第四章:二叉树的应用教学内容旨在帮助学生系统地掌握二叉排序树的相关知识,结合实践与案例分析,提高学生的编程实践能力和问题解决能力。
二叉排序树的实现_课程设计报告

中北大学数据结构课程设计说明书2011年12月20日1.设计任务概述:功能描述:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。
2.本设计所采用的数据结构二叉树及二叉链表3.功能模块详细设计3.1 详细设计思想建立二叉排序树采用边查找边插入的方式。
查找函数采用递归的方式进行查找。
如果查找到相等的则插入其左子树。
然后利用插入函数将该元素插入原树。
对二叉树进行中序遍历采用递归函数的方式。
在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。
删除结点函数,采用边查找边删除的方式。
如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。
3.2 核心代码(1)主菜单模块int main(){LNode root=NULL;int Num,a,x;printf("\n\n *******************************\n");printf(" ************主菜单*************\n");printf(" *1:进行中序排列 *\n");printf(" *2:进行删除操作 *\n");printf(" *3:退出 *\n");printf(" *******************************\n");printf("请输入要进行操作的数字以0结束:\n");运行结果(3)中序遍历模块void view(LNode p){//中序遍历函数if(p){view(p->lch);printf("%d ",p->date);view(p->rch);//递归调用return;}return;}运行结果(3)删除模块LNode DelNode(LNode t,int x) {LNode p=t;LNode q=NULL;LNode s;LNode f;while(p!=NULL){if(p->date==x){break;}q=p;if(x<=p->date){p=p->lch;}else{p=p->rch;}}if(p==NULL){printf("不存在您要删除的数 %d !",x);return p;}if(p->lch){s=p->lch; //s指向其左子树;f=p->lch; //f指向其左子树;while(s-> rch)//搜索左子树的最右边的叶子结点{f=s;s=s->rch;}p->date=s->date;if(f !=s){ //若不是p的左孩子,把r的左孩子作为r的父亲的右孩子f-> rch=s->lch;}else {p->lch = s->lch; //否则结点p的左子树指向s的左子树}free(s);return p;}else{if(q->lch==p){q->lch = p->rch;}else{q->rch = p->rch;}free(p);return q;}}3.3 程序运行结果4.课程设计心得、存在问题及解决方法通过这次课程设计,我进一步的懂得了二叉链表的建立方法,进一步的了解了二叉排序树的构造方法。
二叉排序树的实现数据结构课程设计

题目二叉排序树的实现一、开发背景数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
本课程设计中的二叉排序树,可以用顺序存储和链式存储两种算法计算。
本课程设计中的二叉排序树,一共要实现四项基本的功能。
它们分别是二叉搜索树的创建、中序遍历、查找结点和删除结点。
C语言是一种结构化语言。
它层次清晰,便于按模块化方式组织程序,易于调试和维护。
C语言的表现能力和处理能力极强。
它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。
它还可以直接访问内存的物理地址,进行位(bit)一级的操作。
由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。
既可用于系统软件的开发,也适合于应用软件的开发。
C是C++的基础,C++语言和C语言在很多方面是兼容的,C++程序员可以利用C++与C的兼容性而直接并有效的使用大量现成的程序库,从而开发出更简洁更高效的系统。
需求分析:建立排序二叉树,主要是建立节点来存储输入的数据,需要建立函数来创造排序二叉树。
该题目包括三方面的内容:一个是二叉排序树的建立,而是二叉树的中序遍历,三是二叉树元素的查找并删除。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
关键词:二叉排序树;中序遍历;搜索结点;删除结点;C\C++二、课程设计题目1、二叉排序树的实现问题描述:用顺序和二叉链表作存储结构实现二叉排序树:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;(2)对二叉排序树T作中序遍历,输出结果;(3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。
数据结构二叉排序树课程设计报告

课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (3)二、原理分析及流程 (3)2.1、原理分析............................................................. (3)2.2、流程图........................................................................ .. (4)1、main()函数 (4)2、创建........................................................................ . (4)3、插入........................................................................ . (5)4、查找........................................................................ . (6)5、中序遍历输出 (7)三、算法描述 (8)3.1、存储结构 (8)3.2、插入算法 (8)3.3、查找算法 (9)3.4、删除算法 (10)四、小结与体会 (12)五、程序执行过程 (13)5.1、创建二叉排序树并中序输出.........................................13 5.2、插入并中序输出.. (13)5.3、查找........................................................................ . (14)六、程序清单 (14)一、课程设计简介1.1、题目:二叉排序树相关操作1、创建二叉排序树;2、插入给定值;3、查找给定值;4、删除给定值的结点。
二叉排序树的实现(最终版)

实验报告课程名称数据结构课程设计题目名称二叉树的实现学生学院应用数学学院专业班级 14信安1班学号 **********学生姓名阮志敏指导教师刘志煌2016年12月 9 日二叉排序树的实现一、内容和要求。
1)编程实现二叉排序树,包括生成、插入、删除;2)对二叉排序树进行先根、中根和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?5)格式按照作业的要求,对数据测试,分析,总结和改进的工作要做详细一点。
二、解决方案和关键代码1.二叉排序树的实现。
1)首先定义二叉树的结构体,代码如下:struct TreeNode;typedef struct TreeNode *TreePosition;typedef struct TreeNode *SearchTree;typedef struct TreeNode *Tree;typedef int TreeElementType;struct TreeNode {//二叉树TreeElementType element;//节点中的元素SearchTree left;//左儿子SearchTree right;//右儿子int leght;//节点的深度,用于打印int position;//节点的位置,用于打印};2)实现插入和生成二叉树节点的方法。
在这里用到了递归插入的方法。
SearchTree insertTreeNode(TreeElementType x,SearchTree tree){if(tree == NULL) {tree = makeTree(x,NULL,NULL);//插入在该处}else if(x < tree->element) {tree->left = insertTreeNode(x,tree->left);}else if(x > tree->element) {tree->right = insertTreeNode(x,tree->right);}//如果相等,什么也不做return tree;}当tree == NULL时,就是递归终止的条件,也是插入该节点的地方,在这里,用makeTree()方法创建一个节点,其代码如下:static SearchTree makeTree(TreeElementType x,SearchTree left,SearchTree right) {SearchTree node = (SearchTree)malloc(sizeof(struct TreeNode));if(node == NULL){printf("make TreeNode fail!\n");}else {node->element = x;node->left = left;node->right = right;}return node;}3)实现二叉树节点删除的方法。
数据结构课程设计之二叉排序树的实现

##大学数据结构课程设计报告题目:二叉排序树的实现院(系):计算机工程学院学生姓名:班级:学号:起迄日期: 2011.6.20-2011.7.1指导教师:2010—2011年度第 2 学期一、需求分析1.问题描述:二叉排序树的实现用顺序和二叉链表作存储结构1) 以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;2) 对二叉排序树T作中序遍历,输出结果;3) 输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;2.基本功能1) 生成一棵二叉排2) 对二叉排序树T作中序遍历3) 查找二叉排序树T3.输入输出输入: 输入数列L以回车('\n')为输入结束标志输出: 中序遍历的二叉树二、概要设计1.设计思路:首先,要创建一棵二叉排序树;必须定义二叉排序树的结点结构数据类型,并定义insert函数,在二叉排序树中插入结点。
要中序遍历二叉排序树,必然用到递归算法。
先根再左再右。
要在二叉树中查找输入的元素,若存在含x的结点,则删除该结点,并作中序遍历。
2.数据结构设计:void inorder(node *&root)中序遍历,符合升序输出void insert(node *&ptr,int item)在查找树中插入元素node *find(node *&ptr,int item)在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
node *&findy(node *&ptr,int item)在查找树中查找肯定存在的元素,并返回其引用void dele(node *&ptr)删除值为item所在结点3.软件结构设计Main模块二叉排序树模块三、详细设计1.树的结点数据类型:class node{public:node(int i):data(i),left(NULL),right(NULL){}2.主函数和其他函数的伪码算法;void inorder(node *&root) //中序遍历,符合升序输出{if(root!=NULL){inorder(root->left);cout<<root->data<<' ';inorder(root->right);}}void insert(node *&ptr,int item) //在查找树中插入元素{if(ptr==NULL)ptr=new node(item);else if(item<ptr->data)insert(ptr->left,item);else insert(ptr->right,item);}node *find(node *&ptr,int item) //在查找树中查找元素,找到返回所在结点指针,找不到返回空指针。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计课程名称数据结构课程设计题目名称二叉排序树的实现学院应用数学学院专业班级学号学生指导教师2013 年 12 月 26 日1.设计任务1)实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进行先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。
4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、、成绩3项),对比查找效率,并说明为什么二叉排序树效率高(或者低)。
2. 函数模块:2.1.主函数main模块功能1.通过bstree CreatTree()操作建立二叉排序树。
2.在二叉排序树t过操作bstree InsertBST(bstree t,intkey,nametype name,double grade)插入一个节点。
3. 从二叉排序树t过操作void Delete(bstree &p)删除任意节点。
4. 在二叉排序树t过操作bstnode *SearchBST(bstree t,keytype key)查找节点。
5. 在二叉排序树t过操作p=SearchBST(t,key)查询,并修改节点信息6. 非递归遍历二叉排序树。
7. 定义函数void compare()对数组和二叉排序树的查找效率进行比较比较。
2.2创建二叉排序树CreatTree模块从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。
最后,返回根节点T。
2.3删除模块:二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。
假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。
若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。
在二叉排序树中删除一个节点的算法为void DeleteData(bstree &t,keytype key)若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。
2.4插入模块二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。
新插入的节点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个节点的左孩子或右孩子的节点。
一个无序系列可以通过构造一棵二叉排序树而变成一个有序系列,构造树的过程即为对无序系列进行排序的过程,并且每次插入的节点都是二叉排序树上新的叶子节点,则在进行插入操作时,不必移动其他节点,仅需改变某个节点的指针由空变为非空即可。
二叉排序树的插入算法为bstree InsertBST(bstree t,int key,nametype name,double grade)若二叉排序树中不存在关键字等于key的数据元素时,插入元素并返回TRUE。
2.5查找模块二叉排序树又称二叉查找树,当二叉排序树不为空时,首先将给定的值和根节点的关键字比较,若相等则查找成功,否则将依据给定的值和根节点关键字之间的大小关系,分别在左子树或右子树上继续进行查找。
为此定义一个二叉排序树的查找算法为bstnode *SearchBST(bstree t,keytype key)在根指针t所指向的二叉排序树中查找关键字等于key的数据元素,如成功,返回指向该元素节点的指针,否则返回空指针。
2.6效率比较compare模块void compare()对数组和二叉排序树的查找效率进行比较比较。
2.7二叉排序树的遍历先序遍历也叫做先根遍历。
首先访问根结点然后遍历左子树,最后遍历右子树。
在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。
其实过程为:先遍历左子树root->left->left->left...->null,由于是先序遍历,因此一遇到节点,便需要立即访问;由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。
其一可以用栈记忆在访问途中将依次遇到的节点保存下来。
根据栈的先进后出、后进先出的特点特点。
则可以用栈保存。
每次都将遇到的节点压入栈,当左子树遍历完毕后从栈中弹出最后一个访问的节点,然后访问其右子树。
基本算法思想:1.先访问根节点,将根节点入栈2.重复执行两大步骤:如果该节点左孩子存在,则访问该左孩子节点,并将其指针入栈。
重复以上操作,直到节点的左孩子不存在。
将栈顶的元素,即其指针出栈,回到父节点,如果该指针节点的右孩子存在,则将该指针指向的右孩子节点重复执行以上步骤,直到桟为空为止。
操作函数为void x_print(Tree T)中序遍历:中序遍历和先序遍历访问的顺序不同。
中序遍历访问顺序为中序遍历左子数,在访问根节点,最后中序遍历右子树。
先序遍历是先访问,再入栈;而中序遍历则是先入栈,弹栈后再访问。
将二叉树的根节点入栈,如果该节点有左孩子,将左孩子直接入栈,重复该操作,直到该节点无左孩子;在将栈顶元素出栈,并访问该节点指向的节点,如果该指针指向的右孩子存在,则将当前指针指向右孩子节点。
重复执行步骤直到栈为空为止。
操作函数为void z_print(Tree T )。
后序遍历:先后序遍历左子树,在后序遍历右子树,最后访问根节点。
先将根节点入栈,如果该节点左孩子节点存在,将该节点左孩子节点入栈。
重复执行此操作,直到节点左孩子节点为空。
取栈顶元素,并赋值给P,如果P 的右孩子为空或P的右孩子等于q(即如果p的右孩子已访问,则访问根节点,即p指向的节点,并用q来记录刚刚访问的节点的指针),若p有右孩子,且右孩子没有别访问过,则p=p->rchild。
操作函数为void h_print(Tree T)3.源代码#include<stdio.h>#include<iostream>#include<string>#include<time.h>#include <iomanip>using namespace std;typedef string nametype;typedef unsigned long keytype;typedef struct node //结点的结构体{keytype key;nametype name;int grade;struct node *lchild,*rchild;}bstnode;typedef bstnode *bstree;//栈的定义//typedef struct{ //栈结构bstree *base;bstree *top;int stacksize;}Sqstack;int InitStack (Sqstack &s) //建立一个空栈{s.base=(bstree*)malloc(1000 * sizeof(int));s.top=s.base;return 1;};int Push(Sqstack &s ,node *e)//在栈顶插入元素(进栈){*s.top=e;s.top=s.top+1;return 1;};int Pop(Sqstack &s, bstree &e)//出栈{if(s.top==s.base)return 0;else s.top=s.top-1;e=*s.top;return 1;};//非递归历遍并输出结点信息///*---------------先序非递归遍历---------------*/ void x_print(node *t){Sqstack s;InitStack(s);bstnode *p;p=t;while(p||!(s.top==s.base)){if(p){Push(s,p);cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<"\t"<<endl;p=p->lchild;}else{Pop(s,p);p=p->rchild;}}}/*---------------中序非递归遍历---------------*/ void z_print(node *t){Sqstack s;InitStack(s);bstnode *p;p=t;while(p||!(s.top==s.base)){if(p){Push(s,p);p=p->lchild;}else{Pop(s,p);cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<"\t"<<endl;p=p->rchild;}}}/*---------------非递归后序遍历---------------*/ void h_print(node *t){Sqstack s;InitStack(s);node *p,*q;p=t;q=NULL;while(p || !(s.top==s.base)){if(p){Push(s,p);p=p->lchild;}else{p=*(s.top-1);if(p->rchild==q){Pop(s,q);p=NULL;cout<<q->key<<"\t"<<setw(20);cout<<q->name<<"\t"<<setw(20);cout<<q->grade<<"\t"<<endl;}elsep=p->rchild;q=NULL;}}}}//递归查找二叉树///*---归查找,若找到就返回指向该结点的指针,否则返回空---*/bstnode *SearchBST(bstree t,keytype key) {if(t==NULL||key==t->key)return t;if(key<t->key)return SearchBST(t->lchild ,key);elsereturn SearchBST(t->rchild ,key);}//-------------------给定学生信息插入到二叉树中-------------------// bstree InsertBST(bstree t,int key,nametype name,double grade){bstree p,q;if(t==NULL) //树初始为空,新建二叉树{t=new bstnode();t->key=key;t->name=name;t->grade=grade;t->lchild=t->rchild=NULL;}else{p=t;while(p) //树已存在,按照二叉排序树的特性查找{q=p;if(p->key>key)p=q->lchild;else if(p->key<key)p=q->rchild;else{cout<<endl;cout<<"树中已有该节点:"<<key<<endl;cout<<endl;return t;}p=new bstnode(); //找不到结点就新建一个结点插入到二叉排序树中p->key=key;p->name=name;p->grade=grade;p->lchild=p->rchild=NULL;if(q->key>key)q->lchild=p;elseq->rchild=p;}return t;}//-------------------二叉树排序树的构建-------------------//bstree CreatTree() //不断输入学生信息以插入到二叉树中{bstree t=NULL;keytype key;nametype name;double grade;cout<<"请输入---学号------成绩---(输入0时结束):"<<endl;cin>>key;if(key==0)return t;cin>>name;cin>>grade;while(key) //key==0时退出{t=InsertBST(t,key,name,grade);cout<<"请输入---学号------成绩---(输入0时结束):"<<endl;cin>>key;if(key==0)break;cin>>name;cin>>grade;}return t;}//-------------------删除树中的结点-------------------//void Delete(bstree &p) //删除结点的函数{bstree q,s;if(!p->rchild){q=p;p=q->lchild ;delete q;}else if(!p->lchild){q=p;p=p->rchild;delete q;}else{q=p;s=p->lchild;while(s->rchild){q=s;s=s->rchild;}p->name=s->name;if(q!=p)q->rchild=s->lchild;elseq->lchild=s->lchild;delete s;}}void DeleteData(bstree &t,keytype key) {if(!t){cout<<"没有该信息,请重新输入!";cin>>key;DeleteData(t,key);}else{if(t->key==key){Delete(t); //若找到结点直接删除cout<<"删除成功!"<<endl;}else if(t->key>key)DeleteData(t->lchild,key); //结点数据比查找关键字大,继续在其左子树中查找elseDeleteData(t->rchild,key); //结点数据比查找关键字小,继续在其右子树中查找}}//数组和二叉排序树的查找效率比较//void compare(){bstree t=NULL;clock_t start,end,start1,end1;int num=0;int a=0;int b=0;int c=0;int d=1;bstree p;string key,name;double grade;nametype str [100][3];//cout<<"(输入0时结束)"<<endl;cout<<"请输入---学号------成绩---(输入0时结束):"<<endl;cin>>key;if(key=="0")return ;cin>>name;cin>>grade;while(key!="0"){str[num][0]=key;str[num][1]=name;str[num][2]=grade;int key1=atoi(key.c_str()); //用库函数将字符串转化为关键字的int型t=InsertBST(t,key1,name,grade); //插入结点cout<<"请输入---学号------成绩---(输入0时结束):"<<endl;cin>>key;if(key=="0")break;cin>>name;cin>>grade;num++;}cout<<endl;cout<<"进行数组和二叉排序树的查询效率比较(比较:1 不比较:0)";cin>>d;while(d!=NULL){switch(d){case 0:cout<<"返回选择界面"<<endl;break;case 1:cout<<"数组查询!"<<endl;cout<<"请输入查询的成绩:"<<endl;cin>>key;start=clock();while(a<=10000000) //循环模拟数组查找{while(b<=99){if(str[b][0]==key){b=100;}elseb++;}b=0;a++;}end=clock();if(num>=100)cout<<"数组查询:无查询信息,花费时间: "<<end-start<<" 毫秒"<<endl;elsecout<<"数组查询:查到信息,花费时间: "<<end-start<<" 毫秒"<<endl;int key1=atoi(key.c_str()); //同上转化start1=clock();while(c<=10000000) //用循环来模拟树中查找{p=SearchBST(t,key1);c++;}end1=clock();if(p==NULL)cout<<"树查询:无查询信息,花费时间: "<<end1-start1<<" 毫秒"<<endl;elsecout<<"树查询:查到信息,花费时间: "<<end1-start1<<" 毫秒"<<endl;a=0;b=0;c=0;break;}cout<<"是否继续进行操作(是:1 否:0):";cin>>d;}}//二叉树的深度int TreeDepth(bstree t){int left,right,max;if(t!=NULL){left=TreeDepth(t->lchild);right=TreeDepth(t->rchild);max=left>right?left:right;return max+1;}else{return 0;}}//树状输出二叉树void PrintTree(bstree t,int layer){int k;if(t==NULL)return ;PrintTree(t->rchild,layer+1);for(k=0;k<layer;k++)cout<<" ";cout<<t->key<<"\n";PrintTree(t->lchild,layer+1);}//-------------------主函数测试-------------------//int main(){int d;keytype key;bstree t=NULL;t=CreatTree();d=TreeDepth(t);cout<<"二叉排序树的树形表示如下"<<endl;PrintTree(t,d);char choose;nametype name;bstree p;double grade;cout<<" "<<endl;cout<<"-----------------------------请输入你要选择的操作-------------------------------"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" || a 插入信息 ||"<<endl;cout<<" || b 删除信息 ||"<<endl;cout<<" || c 查询信息 ||"<<endl;cout<<" || d 修改信息 ||"<<endl;cout<<" || 0 退出 ||"<<endl;cout<<" || e 对二叉排序树进行非递归遍历 ||"<<endl;cout<<" || f 进行数组和二叉树查找效率实验||"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<endl;cout<<"需要选择的操作为:";cin>>choose;cout<<endl;while(choose){switch(choose){case 'a'://cout<<"输入学生信息信息(学号为0时结束)."<<endl;cout<<"请输入---学号------成绩---(输入0时结束):"<<endl;cin>>key;if(key==0) /*{PrintTree(t,d);break;}*/cin>>name;cin>>grade;while(key){t=InsertBST(t,key,name,grade);cout<<"请输入---学号------成绩---:"<<endl;cin>>key;if(key==0)break;cin>>name;cin>>grade;}break;case 'b':cout<<"请输入要删除信息学生的成绩:"<<endl;cin>>key;DeleteData(t,key);d=TreeDepth(t);cout<<"删除结点后二叉树的树形显示如下"<<endl;PrintTree(t,d);break;case 'c':cout<<"请输入要查询的成绩:"<<endl;cin>>key;p=SearchBST(t,key);if(p==NULL)cout<<"无查询的关键字:"<<key<<endl;elsecout<<"成绩"<<"\t"<<setw(20)<<""<<"\t"<<setw(20)<<"学号"<<endl;cout<<p->key<<"\t"<<setw(20);cout<<p->name<<"\t"<<setw(20);cout<<p->grade<<endl;break;case 'd':cout<<"请输入要修改的学号:"<<endl;cin>>key;p=SearchBST(t,key);if(p==NULL)cout<<"无你所要修改的关键字:"<<key<<endl;else{cout<<"请输入修改的:";cin>>name;cout<<"请输入修改的成绩:";cin>>grade;p->name=name;p->grade=grade;}break;case 'e':if(!t)cout<<"没有任何信息,请先输入信息!";else{cout<<"学号"<<"\t"<<setw(20)<<""<<"\t"<<setw(20)<<"成绩"<<endl;cout<<"------------------非递归先序遍历----------------"<<endl;cout<<endl;x_print(t);cout<<"------------------非递归中序遍历-----------------"<<endl;cout<<endl;z_print(t);cout<<"------------------非递归后序遍历-----------------"<<endl;cout<<endl;h_print(t);}break;case 'f':cout<<"***此实验为独立实验,实验数据独立于外部数据***"<<endl;cout<<"***请重新输入相关信息***"<<endl;compare();break;default:cout<<"选择错误!";break;}cout<<endl;cout<<endl;cout<<" "<<endl;cout<<"-----------------------------请输入你要选择的操作-------------------------------"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" || a 插入信息 ||"<<endl;cout<<" || b 删除信息 ||"<<endl;cout<<" || c 查询信息 ||"<<endl;cout<<" || d 修改信息 ||"<<endl;cout<<" || 0 退出 ||"<<endl;cout<<" || e 对二叉排序树进行非递归遍历 ||"<<endl;cout<<" || f 进行数组和二叉树查找效率实验||"<<endl;cout<<" ||-----------------------------------||"<<endl;cout<<" |-------------------------------------|"<<endl;cout<<endl;cout<<"选择的操作位:";cin>>choose;cout<<endl;}return 0;}4.运行结果及截图从键盘读入数据以0作为结束标志可得二叉排序树树状表示主菜单选择模块需要在树种添加节点则执行操作a需要在书中删除节点执行操作b需要查询节点信息执行操作c修改某一节点信息执行操作d执行操作0退出程序执行执行操作e对树进行先序遍历、后序遍历、中序遍历运行结果如下图需要对树和数组的查询效率比较执行操作f4.实验结论栈是仅表尾进行插入和删除的线性表,栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,并同时附设指针top指示栈顶元素在顺序栈中的位置。