0

我有一个包含站点地图层次结构的 DataTable,其中包含以下列:

  • 项目 ID
  • 父 ID
  • 姓名
  • 网址

我需要在 HTML 中生成一组嵌套列表(为了清楚起见,将锚元素留在了外面):

<ul>
<li>Item 1</li>
<li>Item 2</li>
    <ul>
    <li>Sub Item 1</li>
    <li class="current">Sub Item 2</li>
    </ul>
<li>Item 3</li>
</ul>

树应该只包含通向“当前”节点/页面的分支(因此使用上面的示例,项目“1”或“3”所具有的任何子项都不会显示。任何人都可以帮助提供一些伪代码/代码示例可以遍历树从叶子到根构建HTML吗?谢谢。

4

4 回答 4

2

The more efficient way of doing this if you can change the data structure is using nested sets:

Managing Hierarchical Data in MySQL

Using the Nested Set Data Model for Breadcrumb Links

于 2008-12-10T19:39:43.113 回答
2

这是一些伪代码。这个想法很简单:从所有未标记的节点开始,然后标记当前节点的父节点、其父节点等等,直到到达根节点。通过这样做,您将准确标记从当前节点到根的路径上的节点。然后您可以简单地打印另一遍中的所有节点,仅在“标记”节点上递归。这是最佳的(运行时间最多是您必须打印的节点数)。

for all n: mark[n]=False
n=current
while n!=root:
    n=parent[n]
    mark[n]=True

def print_tree(n):
    print_node(n)
    if mark[v]==True:
        print '<ul>'
        for each child c of n: print_tree(c)
        print '</ul>'

def print_node(n):
   if n==current: print '<li class="current">' else: print '<li>'
   print name[n]
   print "</li>"

print_tree(root)

parent[n]并且name[n]可能类似于你n.parentn.name结构。关于“对于 n 的每个孩子”部分——我假设你有一个邻接列表维护给定节点的所有孩子的列表。(如果你不这样做,那么子节点的打印顺序是什么?)在任何情况下,只需将每个节点添加到它的父母。列表的大小最多是节点的数量(因为除根以外的每个节点都恰好出现在其中一个列表中),因此这些列表不会占用太多内存(单个列表可能包含很多元素,但是总大小是有界的)。

于 2008-11-27T15:24:38.517 回答
0

我做了类似的东西,它可能效率不高,但很容易调试。

  1. 查找选定节点的路径。
  2. 将根节点添加到列表中。
  3. 在路径中的列表中查找节点。
  4. 将所有子节点添加到此节点。
  5. 查找路径中的下一个节点。
  6. 重复 4-5 直到在选定节点处,如果不在叶子处,则添加选定的子节点。

备选方案: 1. 找到选定节点,打印此节点和所有兄弟节点 2. 从 1 开始打印字符串周围的父节点和所有兄弟节点。 3. 重复 2 直到根。

于 2008-11-27T11:49:44.377 回答
0

这是 VBScript,虽然我没有尝试运行它,所以它可能包含错误,它应该给你基本的想法。

'# OMITTED: Code to retrieve the record for the current node, and read all info about it.
'# Note: field values are read into variables with the same names.

Dim RootFound
Dim ListHTML
RootFound = false
ListHTML = ""

if ParentID = Null then RootFound = true
ListHTML = "<ul><li>" & Name & "</li></ul>"

while not RootFound
  SQL = "SELECT * FROM DataTable WHERE ItemID = " & ParentID
  '# OMITTED: Code to open dataset using the SQL statement above and 
  'fetch all field values into identically named variables

  ListHTML = "<ul><li>" & Name & "</li>" & ListHTML & "</ul>"
  if ParentID = Null then RootFound = true
wend
于 2008-11-27T12:24:50.970 回答