0

次の列を持つサイトマップ階層を含む DataTable があります。

  • アイテム ID
  • 親ID
  • 名前
  • URL

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

データ構造を変更できる場合、これを行うより効率的な方法は、ネストされたセットを使用することです。

MySQL での階層データの管理

ブレッドクラム リンクにネストされたセット データ モデルを使用する

于 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]andname[n]はおそらく and のようなものn.parentですn.name。「n の子ごと」の部分について -- 特定のノードのすべての子のリストを保持する隣接リストがあると思います。(そうしない場合、子を印刷する順序は何ですか?)いずれにせよ、各ノードを「子」リストに追加するだけで、隣接リストを時間O(ノード数)で構築できますその親。リストの合計サイズは最大でノードの数です (ルート以外の各ノードは、リストの 1 つに正確に存在するため)。したがって、これらのリストは多くのメモリを消費しません (単一のリストには多くの要素が含まれる場合がありますが、合計サイズには制限があります)。

于 2008-11-27T15:24:38.517 に答える
0

私は似たようなものを作りました。効率的ではないかもしれませんが、デバッグは簡単です。

  1. 選択したノードへのパスを検索します。
  2. rootnodes をリストに追加します。
  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 に答える