无限级分类的简单算法实现及代码重点讲解.doc_第1页
无限级分类的简单算法实现及代码重点讲解.doc_第2页
无限级分类的简单算法实现及代码重点讲解.doc_第3页
无限级分类的简单算法实现及代码重点讲解.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

无限级分类的简单算法实现及代码重点讲解一、前言很多情况下二级分类已经不能满足需要了,而网上可用的多级分类的例子实在是不好找,故有此文。大家可以先看这个,它介绍了一种超级好的算法。二、我们要解决的问题:1、 分类算法常常表现为树的表示和遍历问题。那么,请问:如果用数据库中的一个Table来表达树型分类,应该有几个字段?2、 如何快速地从这个Table恢复出一棵树;3、 如何判断某个分类是否是另一个分类的子类;4、 如何查找某个分类的所有产品;5、 如何生成分类所在的路径。6、 如何新增分类;三、递归实现的优点与缺点该怎么实现多级分类呢? 估计首先想到的都是递归,实现简单,在指定节点(就是分类,下同)下添加、修改、删除节点都不是问题, 而且节点移动实现起来也不是很难,只是要注意移动目的父节点不能是当前节点的父节节点(等于没移动),也不能是当前节点的子节点(类似于window文件夹,一个文件夹是不能移动到自己的字文件夹里的)。但是最愁人的是搜索指定节点下的东西,怎么办?也就是上面的问题3。记住,这是要包括所有子节点的,难道还去递归吗? 四、介绍下我的简单算法(是我所用的,不是我发明的)以常见的商品系统为例。 4.1 表结构1分类表,T_Sort,表结构如图一所示。其中sortPath保存的是节点路径,这是个重点。 2商品表,T_Product,表结构如图二所示。 center图一图二/center4.2 算法简要说明1parentID保存的自然是节点的父节点,如果一个节点的parentID=0时,认为它是一级分类。 2一个节点的sortPath为它的父节点的sortPath+自己的sortID+ ,。如sortID=32的节点的父节点是节点21,节点21的sortPath是0,21,,那么节点32的sortPath就是0,21,32,。有点绕,看图三清楚啦。可能你想不通为啥最后要多个逗号啊,后面你就明白啦。所有节点的sortPath的左边两位都是0,,因为它们都在根节点下。一个节点的sortPath一定包含在它的子节点的sortPath中。center图三/center4.3 代码重点讲解。这里以我们要实现的功能为例讲解。 1添加节点 选择父节点,可以是根节点,或是下级所有节点(最好列出一个树型菜单让用户选择,别愁,可以实现),其实就是选择parentID。如果parentID=0,那么上级sortPath=0,,如果parentID0,那么到表T_Sort根据parentID取得上级sortPath。给T_Sort新增记录,sortPath=上级sortPath +新记录的sortID +,。范例代码见图4、图5。其中noRecord,closeRs(),showMsg(),closeConn()都是我定义的Function或Sub,它们的功能都是顾名思义的,我就不说了。注意一下,如果你用MS SQL,代码略有不同。我也很奇怪MS SQL时,addNew后,这个新的自动编号可以输出,但是和字符一连接就没有了。各位如果知道为什么,还请相告。center图四图五/center2修改节点 节点的属性只有一个名字而已,直接update就可以了,就不说了。 3删除节点 选择节点如果parentID=0,报错,根节点不能删除。删除该节点及所有子节点。你可能想是不是很麻烦啊,哈哈,其实我只用了一个SQL语句就搞定啦。CODE: (Access)sql=delete from T_Sort where Instr(sortPath,&parentID&,)0 CODE: (MS SQL)sql=delete from T_Sort where CHARINDEX(,&parentID&,sortPath)0 本算法的精华就在这里啦,仔细想想吧,sortPath最后那个逗号的作用也在这里啦。删除上述所有节点下的商品。同上,表名不同而已。CODE: (Access)sql=delete from T_Product where Instr(sortPath,&parentID&,)0 CODE: (MS SQL)sql=delete from T_Product where CHARINDEX(,&parentID&,sortPath)0 范例代码见图6。MS SQL的代码就不贴了。center图六/center4移动节点 难点哦,睁大眼睛仔细看。 选择要移动的节点parentID,选择目的节点toParentID(也就是把当前节点放到谁的下面)。如果parentID=0报错,根节点不能移动。如果toParentID=parentID,这是要把自己放到自己下面,报错。根据parentID,取得它的sortPath,我们叫它fromPath。如果toParentID=0,那么toPath=0,,如果toParentID0,取得它的sortPath,叫它toPath。如果toParentID等于要移动节点的父节点,不需要移动,报错。判断方法是看toPath & parentID &,是否等于fromPath。如果toParentID是要移动节点的子节点,不能移动,报错。判断方法是看Instr(toPath,fromPath)是否大于0。组合要移动节点的新sortPath,也就是newPath=toPath & parentID &,。更新要移动节点及其所有子节点的sortPath()。如0,2,3,5,移动到0,1,下,那么新的sortPath就是0,1,5,了(想想,对吧)。而0,2,3,5,的所有子节点的左半部分都是0,2,3,5,,那么只要把0,2,3,5,替换成0,1,5,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论