《二叉排序树的操作》课程设计报告
二叉排序实现课程设计

二叉排序实现课程设计一、课程目标知识目标: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.课程设计心得、存在问题及解决方法通过这次课程设计,我进一步的懂得了二叉链表的建立方法,进一步的了解了二叉排序树的构造方法。
二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。
本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。
一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。
这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。
二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。
三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。
在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。
插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
重复这个过程,直到所有节点都被插入到树中。
2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。
首先,从根节点开始,将新节点的值与当前节点的值进行比较。
如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。
如果新节点的值与当前节点的值相等,则不进行插入操作。
3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。
如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。
如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。
如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。
四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。
数据结构课程设计(二叉排序树:用顺序表结构存储)报告

教师签字
日期:2013-1-5
4.在删除函数中,最重要的是建立了一个新的数组,并且初始化了该数组,然后将不需要删除的节点保存到该数组中,当删除了指定的数据后,最后返回该数组,并且在对其进行中序遍历,输出。
最后的效果:
输入数据,提示选项,“0”代表退出该程序,“1”代表对给定的数组数据进行中序遍历,“2”代表对给定数据计算平均查找长度,“3”代表删除数据中的节点,并且在中序遍历后输出剩余的数据。
课程设计成绩表
班级:
XXXXX学号:XXX姓名:XXXX
课题名称:
数据结构课程设计(二叉排序树:用顺序表结构存储)
主要工作描述(包括系统实现的主要功能、使用的关键数据结构及算法思想描述、最后的效果):
主要功能:
手动输入一串数字,用“0”代表输入完成,然后通过代码,对这一串数据进行中序遍历,并且输出;其次,可以对该数列进行计算平均查找长度;最后是可以删除该数列中的节点,并且再通过中序遍历后,输出。
使用的关键数据结构及算法思想:
1.运用到了完全搜索二叉树,通过数组的数据,边查找边插入来建立二叉排序树,并且记录结点个数;
2.还运用了中序遍历,通过左子树,根节点,右子树的顺序输出节点;
3.在计算平均查找长度的时候,记录当前结点的在当前树中的深度,再记录已遍历过的点的深度之和,从而得以计算出平均查找长度;
数据结构二叉排序树课程设计报告

课程设计报告——数据结构题目:二叉排序树姓名:学号:专业:班级:指导老师:年月日目录一、课程设计简介 (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、删除给定值的结点。
c语言二叉树的排序课程设计

c语言二叉树的排序课程设计二叉树排序是一种高效的排序算法,它利用二叉树的数据结构来对一组数据进行排序。
本课程设计将介绍如何使用C语言实现二叉树排序算法。
一、二叉树排序的基本原理二叉树排序是一种基于二叉搜索树的排序算法。
它的基本原理是将待排序的元素插入到一棵二叉搜索树中,然后通过中序遍历该二叉搜索树,即可得到一个有序序列。
二、C语言实现二叉树排序下面是一个简单的C语言程序,实现了二叉树排序算法:```c#include <stdio.h>#include <stdlib.h>typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;} TreeNode;// 插入节点TreeNode* insert(TreeNode* root, int val) {root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = val;root->left = NULL;root->right = NULL;return root;}if (val < root->val) {root->left = insert(root->left, val);} else if (val > root->val) {root->right = insert(root->right, val);} else {return root;}return root;}// 中序遍历void inorder(TreeNode* root) {return;}inorder(root->left);printf("%d ", root->val);inorder(root->right);}// 二叉树排序算法void binaryTreeSort(int arr[], int n) {TreeNode* root = NULL;for (int i = 0; i < n; i++) {root = insert(root, arr[i]);}inorder(root); // 中序遍历输出排序后的数组元素}int main() {int arr[] = {5, 2, 9, 1, 5, 6}; // 待排序数组int n = sizeof(arr) / sizeof(arr[0]); // 数组长度binaryTreeSort(arr, n); // 二叉树排序算法调用return 0;}```。
二叉树操作设计和实现实验报告

二叉树操作设计和实现实验报告一、目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。
二、要求:采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。
三、实验内容:1、分析、理解程序程序的功能是采用二叉树链表存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作。
如输入二叉树ABD###CE##F##,链表示意图如下:2、添加中序和后序遍历算法//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}3、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。
(1)输入完全二叉树的先序序列ABD###CE##F##,程序运行结果如下:(2)先序序列:(3)中序序列:(4)后序序列:(5)所有叶子及结点总数:(6)按层次遍历序列:四、源程序代码#include"stdio.h"#include"string.h"#include"stdlib.h"#define Max 20 //结点的最大个数typedef struct node{char data;struct node *lchild,*rchild;}BinTNode; //自定义二叉树的结点类型typedef BinTNode *BinTree; //定义二叉树的指针int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数//==========基于先序遍历算法创建二叉树==============//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void){BinTree T;char ch;if((ch=getchar())=='#')return(NULL); //读入#,返回空指针else{T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点T->data=ch;T->lchild=CreatBinTree(); //构造左子树T->rchild=CreatBinTree(); //构造右子树return(T);}}//========NLR 先序遍历=============void Preorder(BinTree T){if(T) {printf("%c",T->data); //访问结点Preorder(T->lchild); //先序遍历左子树Preorder(T->rchild); //先序遍历右子树}}//========LNR 中序遍历===============void Inorder(BinTree T){if(T){Inorder(T->lchild);printf("%c",T->data);Inorder(T->rchild);}}//==========LRN 后序遍历============void Postorder(BinTree T){if(T){Postorder(T->lchild);Postorder(T->rchild);printf("%c",T->data);}}//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法======== int TreeDepth(BinTree T){int hl,hr,max;if(T){hl=TreeDepth(T->lchild); //求左深度hr=TreeDepth(T->rchild); //求右深度max=hl>hr? hl:hr; //取左右深度的最大值NodeNum=NodeNum+1; //求结点数if(hl==0&&hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。
二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第二学期课程数据结构与算法课程设计名称二叉排序树运算学生姓名顾成方学号03专业班级08计科(2)指导教师王昆仑张贯虹2010 年 5 月题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。
基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。
⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。
一、问题分析和任务定义本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。
实现本程序需要解决以下几个问题:1、如何构造二叉排序树。
2、如何通过中序遍历输出二叉排序树。
3、如何实现多种查找。
4、如何实现插入删除等操作。
二叉排序树的定义:⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。
⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。
⑶其左右子树也分别为二叉排序树。
本问题的关键在于对于二叉排序树的构造。
根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。
当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。
因此,插入算法还要包括对数据的查找判断过程。
本问题的难点在于二叉排序树的删除算法的实现。
删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内蒙古科技大学本科生课程设计论文《数据结构与算法》题目:二叉排序树的操作学生姓名:***学号:**********专业:软件工程班级:13-1班指导教师:***日期:2015年1月6日内蒙古科技大学课程设计任务书目录目录 (2)第一章需求分析 (3)第二章总体设计 (4)第三章抽象数据类型定义 (5)3.1 二叉树BT抽象数据类型的设计 (5)3.2 BT抽象数据类型的设计 (6)第四章详细设计 (7)4.1工程视图 (7)4.2类图视图 (7)4.3函数的调用关系 (8)4.4主程序流程图 (9)4.5主要算法的流程图 (9)第五章测试 (13)第六章总结 (20)附录:程序代码 (21)第一章需求分析二叉排序树的操作以二叉链表表示二叉排序树,在此基础上实现二叉排序树的操作。
要求设计类(或类模板)来描述二叉排序树,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:❖创建二叉排序树❖输出二叉排序树❖在二叉排序树中查找给定值❖在二叉排序树中插入新结点❖在二叉排序树中删除给定值并设计主函数测试该类(或类模板)。
第二章总体设计系统的功能结构:设置二叉排序树根结点、添加二排序叉树结点、删除二排序叉树结点、查找给定的二叉树结点、输出二排序叉树、退出。
功能说明:●设置二叉排序树根结点:为新创建的二叉排序树创建根节点。
●添加二排序叉树结点:需要输入创建节点的数目,然后创建一定数目的二叉排序树结点。
●删除二排序叉树结点:给定一个数据(字母),然后查找,找到后删除,否则,告知未找到,●查找给定的二叉树结点:给定一个数据(字母),然后查找,并给出提示。
●输出二排序叉树:按照先序遍历并输出二叉排序树的结点数据。
●退出:退出程序。
第三章抽象数据类型定义定义格式如下:3.1二叉树BT抽象数据类型的设计ADT BT{数据对象root:先定义一个二叉树结点的结构体:typedef struct bst{char data;struct bst *left;struct bst *right;struct bst *father;}BSTree,*BST;root是指向二叉树结点的指针;数据关系:R={<(V或者C)P(V或者C)>|V,C∈D, <(V或者C)P(V或者C)>表示由运算符P结合起来的表达式E}基本操作:BST InitRoot()操作结果:为空二叉排序树创建一个根节点,输入一个字符型数据,将这个字符型数据存入结点的数据域中同时给左右孩子指针和父指针置空,并返回一个结点的基址给指针。
void Inserter(root, key)初始条件:二叉排序树不为空,存在根节点;操作结果:输入一个字符型数据,先寻找二叉排序树中是否有此数据,有则返回主菜单,没有则就二叉排序树的构造方法返回要插入旳数据应该插入位置的父节点地址,创建一个新结点,将这个字符型数据存入结点的数据域中,并将左右孩子指针置空,父指针指向父节点地址,然后返回主菜单。
BSTree *SearchKey(root,key)初始条件:二叉排序树不为空,存在根节点;操作结果:输入一个字符型数据,先寻找二叉排序树中是否有此数据的,有则返回次数据项的地址给指针变量,没有则就返回该数据按照二叉排序树规则,应该插入位置的父节点地址。
void DeleteKey(root,key);初始条件:二叉排序树不为空,存在根节点;操作结果:输入一个字符型数据,调用BSTree *SearchKey(root,key)函数,先寻找二叉排序树中是否有此数据的,有则返回次数据项的地址给指针变量,然后就此节点的特征分为四类:删除叶子节点;删除只有右孩子的节点;删除只有左孩子的节点;删除左右孩子都有的节点,根据结点类型进入不同删除模块,删除结点,修改相应二叉树结点指针,返回主菜单;没有则就返回提示语句“没有找到该数据”。
void ChainTree_LDR(root)初始条件:二叉排序树不为空,存在根节点;操作结果:按照中序遍历并输出有序的数据序列。
}ADT BT3.2BT抽象数据类型的设计class BT{private:BST root;public:BT() :root(NULL) {}BST InitRoot();void Inserter(BSTree *t,char key);BSTree *SearchKey(BSTree *t,char key);void DeleteKey(BSTree *t,char key);void ChainTree_LDR(BSTree *bt);};第四章详细设计4.1工程视图4.2类图视图4.3函数的调用关系4.4主程序流程图算法:主程序主要用运了switch 结构,使得主程序更加方便的调用成员函数,各个成员函数间的关系也清晰明了。
4.5主要算法的流程图否第五章测试1.主界面:2.设置二叉排序树根节点:在主界面输入1,进入“设置二叉排序树根节点”功能,按提示输入根节点数据,结束到主界面。
3.添加二叉排序树结点:在主界面时,输入2,进入“添加二叉排序树结点”功能。
先进行判空操作,若二叉排序树为空,给出提示:否则按提示输入要添加的结点数目,并依此添加节点数据:4.输出二叉排序树:在主界面时,输入5。
先进行判空操作,若二叉排序树为空,给出提示:否则中序遍历并输出二叉排序树:5.删除二叉排序树结点:在主界面,输入3,进入删除界面。
先进行判空操作,若二叉排序树为空,给出提示:否则按照提示输入要删除的结点数据:(1)若输入数据在二叉排序树中没有:(2)若输入数据在二叉排序树中存在,则删除:如图所示结点L已删除:6.查找给定二叉排序树结点:在主界面,输入4,进入查找界面。
先进行判空操作,若二叉排序树为空,给出提示:然后按照提示输入要查找的结点数据:(1)有的话:(2)没有的话:7.退出程序:在主界面,输入0,退出程序。
第六章总结这次课程设计花费了将近20天时间,这次课程设计在有了前几次课设的经验,困难减少了不少,但也是很艰辛的,从最初定稿到最后完成换了三版代码,从一开始的二叉链表加递归操作,递归函数返回值总是出错,到第二次的二叉链表加非递归操作时的操作繁琐,直到最后用了三叉链表加非递归操作,前前后后修改,换思路继续修改,好多回,又逢各种考试堆叠到一起,确实也是苦不堪言。
非常感谢周李涌老师的指导,没有老师陪我一坐就是两个小时的帮我纠正错误,估计现在也完不成这收尾工作。
今年有意的培养自己在编程方面的兴趣,果然是很有成效的,这次的课设独立完成使我很是振奋,嗯。
没啥可说的了,还是那句话,有付出有回报。
附录:程序代码#include<stdio.h>#include<stdlib.h>#include<process.h>#include<iostream>#include<iomanip>#include<ctime>using namespace std;typedef struct bst{char data;struct bst *left;struct bst *right;struct bst *father;}BSTree,*BST;class BT{private:BST root;public:BT() :root(NULL) {}~BT(){};BST InitRoot();void Inserter(BSTree *t,char key);BSTree *SearchKey(BSTree *t,char key);void DeleteKey(BSTree *t,char key);void ChainTree_LDR(BSTree *bt);};BSTree* BT::InitRoot(){BST node;if(node=new BSTree){cout<<" 输入根节点的数据:";cin>>node->data;node->left=NULL;node->right=NULL;node->father=NULL;return node;}}//初始化根节点void BT::Inserter(BSTree *t,char key){BSTree *p,*parent,*head;if(!(p=new BSTree)){cout<<"申请内存是出错";exit(0);}p->data=key;p->left=NULL;p->right=NULL;p->father=NULL;head=t;while(head){parent=head;if(key<head->data)head=head->left;else if(key>head->data)head=head->right;else if(key==head->data){cout<<"该数据已存在";break;}}if(key<parent->data){parent->left=p;p->father=parent;}else if(key>parent->data){parent->right=p;p->father=parent;}}BST BT::SearchKey(BSTree *t,char key) {BSTree *parent=NULL,*head;head=t;while(head){parent=head;if(key==head->data){parent=head;break;}else if(key<head->data){head=head->left;}else if(key>head->data){head=head->right;}}return parent;}void BT::DeleteKey(BSTree *t,char key){BSTree *p=NULL,*q=NULL,*r=NULL;p=SearchKey(t,key);if(p->data==key){{if(p->left==NULL&&p->right==NULL) //删除叶子节点{if(p->father->left->data==key){r=p;p->father->left=NULL;}else if(p->father->right->data==key){p->father->right=NULL;free(p);}}else if(p->left==NULL&&p->right!=NULL)//删除只有右孩子的节点{if(t->data==key){q=t;t->right->father=NULL;t=q->right;}else if(p->father->left==p){q=p;p->right->father=p->father;p->father->left=p->right;free(q);}else if(p->father->right==p){q=p;p->right->father=p->father;p->father->right=p->right;free(q);}}else if(p->left!=NULL&&p->right==NULL)//删除只有左孩子的节点{if(t->data==key){q=t;t->left->father=NULL;t=t->left;free(q);}else if(p->father->left==p){q=p;p->left->father=p->father;p->father->left=p->right;free(q);}else if(p->father->right==p){p->left->father=p->father;p->father->right=p->right;free(q);}}else if(p->left!=NULL&&p->right!=NULL)//删除左右孩子都有的节点{ BSTree *b;q=p->right;while(q){ b=q;q=q->left;}p->data=b->data;if(b->right!=NULL){b->right->father=b->father;b->father->right=b->right;}else if(b->right==NULL){b->father->right=NULL;free(b);}}}}else if(p->data!=key){ cout<<"没有找到该数据"; }}void BT::ChainTree_LDR(BSTree *bt){if(bt){ChainTree_LDR(bt->left);cout<<setw(3)<<bt->data;ChainTree_LDR(bt->right);}return;}//先序递归遍历二叉树int main(){system("color 0E");BT a;BSTree *root=NULL;int select1,n,i;char key,key1,key2;do{long t;time(&t);cout<<endl;cout<<" 当前时间:";cout<<ctime(&t)<<endl;cout<<"\n>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<< ";cout<<"\n >>>> 1.设置二叉排序树根结点<<<< ";cout<<"\n >>>> 2.添加二排序叉树结点<<<< ";cout<<"\n >>>> 3.删除二排序叉树结点<<<< ";cout<<"\n >>>> 4.查找给定二叉树结点<<<< ";cout<<"\n >>>> 5.输出二排序叉树<<<< ";cout<<"\n >>>> 0.退出<<<< ";cout<<"\n 请选择:";cin>>select1;switch(select1){case 1:cout<<endl;root=a.InitRoot();break;case 2:cout<<endl;if(root==NULL){cout<<" 空树禁止操作";cout<<endl;}else{cout<<" 请输入你要添加的结点数目:";cin>>n;fflush(stdin);for(i=0;i<n;i++){cout<<" 请输入你要添加的结点数据:";cin>>key;a.Inserter(root,key);fflush(stdin);}}break;case 3:cout<<endl;if(root==NULL){cout<<" 空树禁止操作";cout<<endl;}else{cout<<" 请输入你要删除的结点数据:";fflush(stdin);cin>>key1;a.DeleteKey(root,key1);cout<<endl;}break;case 4:cout<<endl;if(root==NULL){cout<<" 空树禁止操作";cout<<endl;}else{BSTree *key;cout<<" 请输入你要查找的结点数据:";fflush(stdin);cin>>key2;key=a.SearchKey(root,key2);if(key->data==key2){cout<<" 二叉树中有此数据";cout<<endl;}else{cout<<" 二叉树中没有此数据";cout<<endl;}}break;case 5:cout<<endl;if(root==NULL){cout<<" 空树禁止操作";cout<<endl;}else{内蒙古科技大学a.ChainTree_LDR(root);cout<<endl;}break;case 0:exit(0);break;};system("pause");cout<<endl;cout<<endl;cout<<endl;cout<<endl;}while(select1!=0);return 0;}30。