2008-11-27 100 views
0

我有包含具有以下列站点地图层次的DataTable:递归算法生成网站地图

  • 项目Id
  • 的ParentId
  • 名称
  • 网址

我需要在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,因为它可以遍历从叶到树的树?谢谢。

回答

0

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

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

备选: 1.查找选择的节点,打印这和所有兄弟姐妹 2.打印亲和字符串周围的所有兄弟姐妹从1 3.重复2,直到在根。

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 
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的每个孩子”部分 - 我认为你有一个邻接列表维护给定节点的所有孩子的列表。 (如果你不这样做,那么孩子应该打印的顺序是什么?)无论如何,通过简单地将每个节点添加到“孩子”列表中,可以在时间O(节点数)中建立邻接列表其父母。总共总数列表的大小至多是节点的数量(因为除根之外的每个节点恰好出现在列表中的一个中),所以这些列表不会占用太多内存(单个列表可能包含很多元素,但总大小是有限的)。