版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/53150691

利用自我内部循环——也就是无限递归——避免之前用那种比较傻的方式:4级菜单就用4个struct嵌套。并循环for也是4层。

实现无限级struct嵌套,转成json,供treeview使用,即无限级树状菜单。

数据库结构用可以理解的传统的parentid,而不用那种left和right的树:https://segmentfault.com/q/1010000000126370/a-1020000000126714

好吧我忘了提一个很dirty的方法。

如果你的树深度是可预期的话,有个超简单的数据结构。你需要3个字段来表达这个树:

  1. id,本节点的primary key
  2. parent_id,其值为父节点的primary key
  3. key,忘了学名叫啥了,你可以称为线索
  4. level,表示当前节点到根节点的距离

其中,key字段的值为:从跟节点到父节点的primary key,中间用任意非数字符号分割。

例如以下树状结构

对应的数据库表值为:

于是,在给定一个节点d的时候,

select * from table_name where key  like "${d.key}-${d.id}-%"select * from table_name where key  like "${d.key}-${d.id}-%" and level=${d.level}+1

这个设计,结构非常简单。key和level是辅助字段,维护这两个字段成本很低,即使全部重建要比MPT简单多了。

yegle2.5k 声望

yegle的数据错了吧?根节点的 key应该是"" 吧。查找d的所有子孙节点应该是 select * from table_name where key like "${d.key}${d.id}-%" 查找子节点应该是: select * from table_name where key like "${d.key}${d.id}-%" and level=${d.level}+1

Rory_Ye · 2014年06月28日

+1

的确,应该按照@Rory_Ye 说的才对。否则,一级节点无法查看自己的子孙节点。

faker · 6月3日

我刚去看了Modified Preorder Tree,我有疑问的是如果我添加一个字节点,那么数据库的表不是都得改?这个树和线段树类似啊。

tansumanong · 6月8日

当我没说,原来是数据库,我以为是 java web,哈哈

tansumanong · 6月8日

查询的时候用的是like,会高效吗?

play175 · 7月7日