0

我有一个网络系统,它有一个保存在数据库中的经典父子菜单,字段 id 作为 PK,parent_id 指向拥有的菜单。(是的,我知道这不能很好地扩展,但这是另一个话题)。

所以对于这些记录(id-parent_id 对):

0-7 0-4 4-9 4-14 4-16 9-6

我有这棵树:

0
├ 7
└ 4
  ├ 9
  | └ 6     
  ├ 14
  └ 16

我需要隐藏一个顶部节点,所以我必须列出该特定节点的所有子节点,即对于 4,它们将是 (9, 6, 14, 16)。顺序无所谓。

我很困惑......这是否适合经典的树问题?还是图表?

我怎样才能组成这个结构并使用 php 解决这个问题?

4

4 回答 4

2

相邻列表模型很难处理。我所在的公司现在将它们用于层次结构,这引起了极大的头痛。我已经成功地为以前的雇主使用了 Celko 的嵌套集模型,它们非常适合创建、维护和使用层次结构(树)。

我找到了描述它们的链接:http: //www.intelligententerprise.com/001020/celko.jhtml

但我也推荐 Joe Celko 写的书“Smarties 的 SQL:高级 SQL 编程”,其中涵盖了嵌套集。

Joe Celko 为 Smarties 编写的 SQL:高级 SQL 编程

Joe Celko 为 Smarties 编写的 SQL 中的树和层次结构

于 2008-09-17T01:53:42.017 回答
1

这是使用递归的绝佳机会!

伪代码:

nodeList = {}
enumerateNodes(rootNode, nodeList);

function enumerateNodes(node, nodeList) {
   nodeList += node;
   foreach ( childnode in node.children ) {
       enumerateNodes(childnode, nodeList);
   }
}

编辑:没有注意到你的树是相邻的列表格式。在我开始使用它之前,我可能只是将它构建到一个实际的树数据结构中。只需遍历所有对(第一次看到它们时创建节点)并链接它们。我觉得应该很简单...

于 2008-09-17T01:48:11.657 回答
0

这是一个图形问题。查看BFS(广度优先搜索)DFS(深度优先搜索)。. 你可以用谷歌搜索这些术语并在网络上找到数百个实现。

于 2008-09-17T01:54:53.090 回答
0

这对于嵌套集实现来说是微不足道的。有关更多详细信息,请参见此处:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

否则,编写如下内容:

def get_subtree(node)
  if children.size > 0
    return children.collect { |n| get_subtree(n) }
  else
    return node
  end
end
于 2008-09-17T02:21:12.700 回答