【问题标题】:Recursion algorithm to generate sitemap递归算法生成站点地图
【发布时间】:2010-09-24 07:44:33
【问题描述】:

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

  • 物品编号
  • 父母身份
  • 姓名
  • 网址

我需要在 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?谢谢。

【问题讨论】:

    标签: c# algorithm recursion


    【解决方案1】:

    如果可以更改数据结构,更有效的方法是使用嵌套集:

    Managing Hierarchical Data in MySQL

    Using the Nested Set Data Model for Breadcrumb Links

    【讨论】:

      【解决方案2】:

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

      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 的每个孩子”部分——我假设你有一个邻接列表维护给定节点的所有孩子的列表。 (如果你不这样做,那么子节点的打印顺序是什么?)在任何情况下,只需将每个节点添加到它的父母。列表的 total 大小最多为节点数(因为除根以外的每个节点都恰好出现在其中一个列表中),因此这些列表不会占用太多内存(单个列表可能包含很多元素,但总大小是有限的)。

      【讨论】:

        【解决方案3】:

        这是 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
        

        【讨论】:

          【解决方案4】:

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

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

          替代方案: 1. 找到选中的节点,打印这个和所有的兄弟节点 2. 从 1 开始打印字符串周围的父级和所有兄弟级。 3. 重复2直到根。

          【讨论】:

            猜你喜欢
            • 2017-11-29
            • 1970-01-01
            • 2017-10-31
            • 1970-01-01
            • 2015-08-11
            • 2015-07-20
            • 2014-06-11
            • 1970-01-01
            • 2020-12-09
            相关资源
            最近更新 更多