質問
私はデータベースに保存された古典的な親子メニューを持ったWebシステムを持っています。フィールドIDはPKであり、parent_idは所有するメニューを指します。(はい、これがあまりうまく拡張できないことはわかっていますが、それは別のトピックです)。
したがって、これらのレコード (id-parent_id ペア) については次のようになります。
0-7 0-4 4-9 4-14 4-16 9-6
私はこの木を持っています:
0
├ 7
└ 4
├ 9
| └ 6
├ 14
└ 16
最上位ノードを非表示にする必要があるので、その特定のノードのすべての子のリストを作成する必要があります。4 の場合、(9、6、14、16) になります。順序は関係ありません。
私は混乱しています...これは古典的な木の問題に当てはまりますか?それともグラフ1ですか?
PHP を使用してこの構造を作成し、この問題を解決するにはどうすればよいでしょうか?
解決
これは再帰を使用する絶好のチャンスです。
疑似コード:
nodeList = {}
enumerateNodes(rootNode, nodeList);
function enumerateNodes(node, nodeList) {
nodeList += node;
foreach ( childnode in node.children ) {
enumerateNodes(childnode, nodeList);
}
}
編集:ツリーが隣接リスト形式であることに気づきませんでした。おそらく、作業を始める前に、それを実際のツリー データ構造に構築するだけでしょう。すべてのペアをループして (初めて見たときにノードを作成します)、それらをリンクするだけです。私 考える それは簡単なはずです...
他のヒント
隣接リスト モデルを扱うのは非常に困難です。私が今いる会社では階層構造にこれらを使用しているため、大きな頭痛の種となっています。私は以前の雇用主のために Celko のネストされたセット モデルを使用して成功しており、階層 (ツリー) の作成、維持、使用に非常にうまく機能しています。
それらについて説明しているこのリンクを見つけました。 http://www.intelligententerprise.com/001020/celko.jhtml
ただし、『SQL for Smarties:』という本もお勧めします。「Advanced SQL Programming」は Joe Celko 著で、ネストされたセットについて説明しています。
これはグラフの問題です。チェックアウト BFS(幅優先検索) そして DFS(深さ優先検索)。. 。これらの用語を Google で検索すると、Web 上で何百もの実装を見つけることができます。
これは、ネストされたセットの実装では簡単です。詳細については、こちらを参照してください。
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
それ以外の場合は、次のように書きます。
def get_subtree(node)
if children.size > 0
return children.collect { |n| get_subtree(n) }
else
return node
end
end