ここにいくつかの擬似コードがあります。アイデアは単純です。すべてのノードをマークしない状態から始めて、現在のノードの親、その親などをルートに到達するまでマークします。これにより、現在のノードからルートまでのパス上のノードを正確にマークしたことになります。次に、「マークされた」ノードでのみ再帰して、別のパスのすべてのノードを単純に出力できます。これは最適です (実行時間は、印刷する必要があるノードの数までです)。
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 つに正確に存在するため)。したがって、これらのリストは多くのメモリを消費しません (単一のリストには多くの要素が含まれる場合がありますが、合計サイズには制限があります)。