1、基于BST二叉排序树的城市信息管理内容清晰一、 设计题目【问题描述】利用二叉排序树实现城市信息管理,城市信息包括城市名、城市坐标(X,Y)。【基本要求】将若干城市信息按城市名的顺序建立二叉排序树;可以插入一个城市信息;按城市名查找一个城市信息;输入一个城市名,查找和该城市名的距离在指定范围内的所有城市。【测试数据】自己指定。【选作内容】 删除一个城市信息。二、需求分析1)运行环境(软、硬件环境)Microsoft visual c+6.0PC+window 72)输入的形式和输入值的范围输入城市信息,例如:“城市名 左坐标 右坐标”的形式。输入的左右坐标是整型的,城市名是字符串(以中文的形式)
2、。左右坐标为100内的整数。3)输出的形式描述输出的是城市信息,就是例如:“城市名 左坐标 右坐标”的形式。4)功能描述 输入参数包括:城市名,左坐标,右坐标;需要插入的城市与左右坐标;需要查找的城市名;需要查找周围城市信息的城市名与搜索范围;需要删除的城市名。功能要求:1.将若干城市信息按城市名的顺序建立二叉排序树;2.可以插入一个城市信息;3.按城市名查找一个城市信息;4.输入一个城市名,查找和该城市名的距离在指定范围内的所有城市。5.删除一个城市信息(选作)。5)测试数据输入的城市信息:兰州(5,6)成都(3,4)西安(4,9)上海(2,8)北京(1,3)需要插入的城市:银川(3,5)需
3、要查找的城市:兰州需要查找哪个城市周围城市:西宁查找范围:20需要删除的城市名:新疆(选做)三、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt及实验) 本设计采用非线性结构中的树结构的二叉排序树思想,定义了如下的各类的成员及成员函数:类: information(包含城市的所有信息) 其中cityname作为其成员。并在类内定义了一个结构体,x,y为其成员,并定义了结构体的对象cityname_location,用来后期调用坐标变量x,y。类:BiNode (二叉排序树的结点结构) 将后面的BiTree作为其友元类。 其中定义了之前information类
4、的对象data作为自己的成员,并定义了指向左孩子的指针和指向右孩子的指针。类:BiTree (二叉排序树的类) 定义了带参构造函数。 获取指向根结点的指针的成员函数(函数成员名Getroot); 用于起始插入值的成员函数(函数成员名InsertBST); 用于后期插入值的成员函数(函数成员名InsertBST1); 用于删除一个或者多个结点的成员函数(函数成员名deleteBST)和其后面需要用到的两个函数(函数名:searchMinRchild,searchParent);(选做) 用于查找城市信息的成员函数(成员函数名SearchBST); 用于前序遍历二叉树的成员函数(成员函数名Preo
5、rder); 用于中序遍历二叉树的成员函数(成员函数名Inorder); 用于选择界面的成员函数(成员函数名Choose); 用于对起始城市坐标赋值的成员函数(成员函数名Begain); 用于查找需要被动比较的城市的坐标的成员函数(成员函数名Find); 用于查找作为参照的城市坐标的成员函数(成员函数名Find1)还定义了二叉排序树(即二叉链表)的根指针(root)2)功能模块设计(如主程序模块设计)1、起始: 输入要输的城市的个数(数字,中文,英文都可以,大小写皆可)。 调用插入函数InsertBST,根据城市的名字(利用其ascii码值)进行二叉排序树的创建。 调用Begain函数,对起始
6、城市坐标赋值 完成所有城市的所有信息输入完成,待用。2、主菜单模块: 调用Choose函数,进行主菜单显示,并用switch与case进行菜单内容的选择实现。做到每次信息更新后都能及时显示在屏幕上供用户查看。3、前序遍历城市信息表模块: 调用前序遍历二叉树的成员函数(成员函数名Preorder),对已创建的二叉排序树进行前序遍历输出。4、中序遍历城市信息表模块: 调用中序遍历二叉树的成员函数(成员函数名Inorder),对已创建的二叉排序树进行中序遍历输出。5、查询城市信息模块: 输入查询的总次数,用for循环实现多次的查找; 输入要查询的城市; 调用函数SearchBST进行查找。 结果显示
7、。6、查找制定距离内的城市信息模块: 输入指定的城市; 输入指定的距离; 用for循环实现对所有已有的城市信息的查找。 调用函数Find查找需要被动比较的城市的坐标; 调用函数Find1查找作为参照的城市坐标。 对相应的城市坐标进行算术运算,相减平方开放 (即:sqrt(x-z)*(x-z)+(y-w)*(y-w)) 最终判定结果显示。7、插入模块: 输入插入的总次数,用for循环实现多次的插入; 输入要插入的城市(新申请一个结点,用输入的城市名赋值于结点的data.city); 由于新加了一个结点,所以总个数n要相应改变,每插入一个加一,并将信息放入对应的数组单元。 将新结点的指向左右孩子的
8、指针赋值为空。 调用函数InsertBST进行插入,将其接入适合的二叉排序树的位置根据(左小右大)。 结果显示。8、删除模块:(选做) 输入删除的总次数,用for循环实现多次的删除; 输入要删除的城市; 先调用函数SearchBST对输入值进行查找,如果找到则,有效删除,否则显示不存在给的城市名。 结果显示。9、退出模块: 显示本人信息,对使用表示感谢,然后用exit(0)直接退出程序。 3)模块层次调用关系图 各模块之间的关系图:四、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。1.二叉排序树的定义二叉排序树(Binary Sort Tree)又称二叉
9、查找(搜索)树(Binary Search Tree)。其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:若它的左子树非空,则左子树上所有结点的值均小于根结点的值;若它的右子树非空,则右子树上所有结点的值均大于根结点的值;左、右子树本身又各是一棵二叉排序树。上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。templateclass BiTree public: BiTree(T a,int n);/带参构造函数 BiNode*Getroot()return root;/获取指向根结点的指针 BiNode*InsertBST(BiNode*root
10、,BiNode*s); /在二叉排序树中插入一个结点s,此处用于起始值插入 BiNode*InsertBST1(BiNode*root,BiNode*s); /2在二叉排序树中插入一个结点s,用于后期功能的多个或一个插入 /值,会显示插入成功 BiNode*SearchBST(BiNode*root,T k);/查找值为k的结点 void Preorder(BiNode*rt);/前序遍历二叉树 void Inorder(BiNode*rt); /中序遍历二叉树 void Choose();/选择界面 BiNode*Begain(BiNode*root,BiNode*s);/对城市X,Y坐标进
11、行初始化 BiNode*Find(BiNode*root,T k);/用于查找需要被比较的城市的坐标 BiNode*Find1(BiNode*root,T k);/查找作为参照的城市坐标 private: BiNode*root;/二叉排序树的根指针;2.二叉排序树的性质 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列。3.二叉排序树的插入 在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。此处我将插入模块分成了两个部分。第一个用来将刚开始的数据建立最初的二叉排序树BiNode* BiTree:InsertBST(BiNode *root, BiNode *s
12、)情况1、先判断if(root=NULL)即如果原结点不存在,则,插入结点变成根结点return s;情况2、如果有结点存在,则进行判断,二叉排序树特点,根结点关键字大于其左子树,小于其右子树1) 插入结点小于根结点。即:if(s-data.citydata.city)/root-lchild = InsertBST(root-lchild, s); /插入左子树,再依次往下比较。 2)插入结点大于根结点。root-rchild = InsertBST(root-rchild, s); 插入到右子树中,再依次比较,最终确定位置插入过程:templateBiNode*BiTree:InsertB
13、ST(BiNode*root,BiNode*s)/在二叉排序树中插入一个结点s,此处用于起始插入值 if(root=NULL) /如果原结点不存在,则插入结点变成根结点 return s; else/如果有结点存在,则进行判断,二叉排序树特点,根结点大于其左子树,小于其右子树 if(s-data.citydata.city)/插入结点小于根结点(按关键字城市名进行判断) root-lchild=InsertBST(root-lchild,s);/插入到左子树中 else /插入结点大于根结点(按关键字城市名进行判断) root-rchild=InsertBST(root-rchild,s);
14、/插入到右子树中 return root; templateBiNode*BiTree:InsertBST1(BiNode*root,BiNode*s)/1在二叉排序树中插入一个结点s,用于后期功能的多个或一个插入值,会显示插入成功 if(root=NULL) /如果原结点不存在,则,插入结点变成根结点 return s; else if(s-data.citydata.city) root-lchild=InsertBST(root-lchild,s); else root-rchild=InsertBST(root-rchild,s); cout endl; Begain(root,s); return root;4.二叉排序树的查找 假定二叉排序树的根结点指针为 root ,给定的关键字值为 K ,则查找算法可描述为:templateBiNode*BiTree:Find(BiNode*root,T k) /得到被比较结点的x,y坐标,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1