浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验五二叉搜索树的基本操作学生姓名蓝礼巍专业班级学号实验成绩指导老师(签名)日期一.实验目的和要求1.掌握二叉搜索树的基本概念。
2.掌握二叉搜索树基本操作的实现。
二. 实验内容1. 设在一棵二叉搜索树的每个结点的data域中,含有关键字key域和统计相同关键字元素个数的count域。
当向该树插入一个元素时,若树中已有相同关键字值的结点,则使该结点的count域值增1,否则由该元素值生成一个新结点插入到该树中,并使其count域值为1。
当向该树删除一个元素时,若树中该元素结点的count域值大于1,则使该结点的count域值减1,否则(count 域值等于1)删除该结点。
编写头文件bstree.h,实现上述二叉搜索树的存储结构定义与基本操作实现函数;编写主函数文件test8_1.cpp,验证头文件中各个操作。
基本操作包括:①void InitBSTree(BTreeNode *&bst);//初始化该二叉搜索树②void PrintBSTree(BTreeNode *bst);//以广义表形式输出该二叉搜索树(输出内容包括关键字值与相同元素个数值)③void Insert (BTreeNode *&bst, ElemType item);//插入一个元素到该二叉搜索树(用非递归算法实现)④int Delete (BTreeNode *&bst , ElemType item);//从二叉搜索树中删除某个元素(用非递归算法实现)⑤ElemType MaxBSTree(BTreeNode *bst);//求该二叉搜索树的最大关键字值(用非递归算法实现)2.选做:编写下列操作的实现函数,添加到头文件bstree.h中,并在主函数文件test8_1.cpp中添加相应语句进行测试。
①void PrintNode1(BTreeNode *bst);//按递减序打印二叉搜索树中所有左子树为空,右子树非空的结点数据域的值②void PrintNode2(BTreeNode *bst, int x );//从小到大输出二叉搜索树中所有关键字值>=x 的结点数据域的值3. 填写实验报告,实验报告文件取名为report5.doc。
4. 上传实验报告文件report5.doc与源程序文件bstree.h及test8_1.cpp到Ftp服务器上你自己的文件夹下。
三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路1 void InitBSTree(BTreeNode *&bst); //初始化该二叉搜索树2 void PrintBSTree(BTreeNode *bst);//以广义表形式输出该二叉搜索树(输出内容包括关键字值与相同元素个数值)3 void Insert (BTreeNode *&bst, ElemType item); /插入一个元素到该二叉搜索树(用非递归算法实现)4 int Delete (BTreeNode *&bst , ElemType item);/从二叉搜索树中删除某个元素(用非递归算法实现)5 ElemType MaxBSTree(BTreeNode *bst);//求该二叉搜索树的最大关键字值(用非递归算法实现)6 void PrintNode1(BTreeNode *bst); //按递减序打印二叉搜索树中所有左子树为空,右子树非空的结点数据域的值7 void PrintNode2(BTreeNode *bst, int x );/从小到大输出二叉搜索树中所有关键字值>=x 的结点数据域的值四. 实验结果与分析包括运行结果截图等五. 心得体会记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
【附录----源程序】Cpp:/*基本操作包括:①void InitBSTree(BTreeNode *&bst);//初始化该二叉搜索树②void PrintBSTree(BTreeNode *bst);//以广义表形式输出该二叉搜索树(输出内容包括关键字值与相同元素个数值)③void Insert (BTreeNode *&bst, ElemType item);//插入一个元素到该二叉搜索树(用非递归算法实现)④int Delete (BTreeNode *&bst , ElemType item);//从二叉搜索树中删除某个元素(用非递归算法实现)⑤ElemType MaxBSTree(BTreeNode *bst);//求该二叉搜索树的最大关键字值(用非递归算法实现)2. 选做:编写下列操作的实现函数,添加到头文件bstree.h中,并在主函数文件test8_1.cpp中添加相应语句进行测试。
①void PrintNode1(BTreeNode *bst);//按递减序打印二叉搜索树中所有左子树为空,右子树非空的结点数据域的值②void PrintNode2(BTreeNode *bst, int x );//从小到大输出二叉搜索树中所有关键字值>=x 的结点数据域的值*/#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include"bstree.h"void main(){ElemType x;BTreeNode *B;InitBSTree(B);cout<<"请输入二叉搜索树,以0 结束"<<endl;cin>>x.key;while(x.key!=0){Insert(B,x);cin>>x.key;}cout<<"以广义表形式输出该二叉搜索树(输出内容包括关键字值与相同元素个数值):"<<endl;PrintBSTree(B);cout<<endl;cout<<"该二叉搜索树的最大关键字值:"<<endl;printf("%d\n",MaxBSTree(B));cout<<"输入要删除的元素的关键值:";cin>>x.key;if(Delete(B,x)!=0){cout<<"以广义表形式输出该二叉搜索树(输出内容包括关键字值与相同元素个数值)"<<endl;PrintBSTree(B);cout<<endl;}cout<<"按递减序打印二叉搜索树中所有左子树为空,右子树非空的结点数据域的值:"<<endl;PrintNode1(B);cout<<endl;cout<<"从小到大输出二叉搜索树中所有关键字值>=x 的结点数据域的值:"<<endl;cout<<"请输入x的值:";cin>>x.key;PrintNode2(B,x.key);cout<<endl;}H:typedef struct{int key;int count;}ElemType;struct BTreeNode{ElemType data;BTreeNode *left;BTreeNode *right;};void InitBSTree(BTreeNode *&bst){bst=NULL;}void PrintBSTree(BTreeNode *&bst){if(bst!=NULL){cout<<"("<<bst->data.key<<","<<bst->data.count<<")";if(bst->left!=NULL||bst->right!=NULL){cout<<"(";PrintBSTree(bst->left);if(bst->right!=NULL)cout<<"(";PrintBSTree(bst->right);cout<<")";}}}void Insert (BTreeNode *&bst, ElemType item) {BTreeNode *t=bst,*parent=NULL,*p;while(t!=NULL){parent=t;if(item.key<t->data.key)t=t->left;else if(item.key>t->data.key)t=t->right;else{t->data.count++;return;}}p=new BTreeNode;p->data.key=item.key;p->data.count=1;p->left=p->right=NULL;if(parent==NULL)bst=p;else if(item.key<parent->data.key)parent->left=p;elseparent->right=p;}int Delete (BTreeNode *&bst , ElemType item) {BTreeNode *p=bst,*fp=NULL;while(p!=NULL&&p->data.key!=item.key){fp=p;p=(p->data.key>item.key)?p->left:p->right;}if(p==NULL)cout<<"删除失败!"<<endl;if(p!=NULL)if(p->data.count>1) p->data.count--;else{if(p->left==NULL&&p->right==NULL){ if(fp==NULL){delete p;bst=NULL;}else{if(fp->left==p)fp->left=NULL;elsefp->right=NULL;delete p;}}else if(p->left!=NULL&&p->right!=NULL){ fp=p;BTreeNode *q=fp->left;ElemType temp;while(q->right!=NULL){fp=q;q=q->right;}temp.count=p->data.count;temp.key=p->data.key;p->data.count=q->data.count;p->data.key=q->data.key;q->data.count=temp.count;q->data.count=temp.key;if(q->left==NULL&&q->right==NULL){if(fp->left==p)fp->left=NULL;elsefp->right=NULL;delete p;}else{if(fp->left==p)fp->left=(p->right==NULL)?p->left:p->right;elsefp->right=(p->right==NULL)?p->left:p->right; delete p;}}else{if(fp==NULL){bst=(p->left!=NULL)?p->left:p->right;delete p;}else{if(fp->left==p)fp->left=(p->right==NULL)?p->left:p->right;elsefp->right=(p->right==NULL)?p->left:p->right;delete p;}}}return true;/*BTreeNode *p=bst,fp=NULL;while(p!=NULL&&p->data!=item){fp=p;if(p->data>x)p=p->left;elsep->right;}if(p==NULL)return 0;if(p->left==NULL&&p->right==NULL){if(fp==NULL){delete p;bst=NULL;}else}ElemType MaxBSTree(BTreeNode *bst){BTreeNode *p=bst;ElemType x;if(p==NULL)printf("空树");if(p->right==NULL&&p->left==NULL)return p->data;if(p->right!=NULL){while(p->right!=NULL){x=p->right->data;p=p->right;}return x;}}void PrintNode1(BTreeNode *bst)//按递减序打印二叉搜索树中所有左子树为空,右子树非空的结点数据域的值{if(bst==NULL)return;PrintNode1(bst->right);if(bst->left==NULL&&bst->right!=NULL)cout<<bst->data.key<<" ";PrintNode1(bst->left);}void PrintNode2(BTreeNode *bst, int x )//从小到大输出二叉搜索树中所有关键字值>=x 的结点数据域的值v{if(bst==NULL)return;if(x<bst->data.key){PrintNode2(bst->left,x);cout<<bst->data.key<<" ";PrintNode2(bst->right,x);}else if(x>bst->data.key){PrintNode2(bst->right,x);else if(x==bst->data.key){cout<<bst->data.key<<" ";PrintNode2(bst->right,x);}}。