我有一个web系统,它有一个经典的父子菜单保存在数据库中,字段id作为主键,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)。顺序并不重要。
我很困惑..。这是否适用于经典的树问题?或者它是一个图1?
我如何构建这个结构并用php解决这个问题呢?
发布于 2008-09-17 01:48:12
这是使用递归的绝佳机会!
伪代码:
nodeList = {}
enumerateNodes(rootNode, nodeList);
function enumerateNodes(node, nodeList) {
   nodeList += node;
   foreach ( childnode in node.children ) {
       enumerateNodes(childnode, nodeList);
   }
}编辑:未注意到您的树采用相邻列表格式。在我开始使用它之前,我可能只会将它构建到一个实际的树数据结构中。只需遍历所有对(第一次看到节点时创建节点)并链接它们。我想这应该很简单。
发布于 2008-09-17 01:53:42
相邻列表模型很难处理。我所在的公司现在将它们用于层级结构,这会造成很大的麻烦。我已经成功地为以前的雇主使用了Celko的嵌套集合模型,它们在创建、维护和使用层次结构(树)方面效果很好。
我找到了描述它们的链接:http://www.intelligententerprise.com/001020/celko.jhtml
但我也推荐Joe Celko写的"SQL for Smarties: Advanced SQL Programming“一书,该书涵盖了嵌套集。
发布于 2008-09-17 01:54:53
这是一个图形问题。查看BFS(breadth first search)和DFS(depth first search).。你可以在谷歌上搜索这些术语,并在web上找到数百种实现。
https://stackoverflow.com/questions/79041
复制相似问题