1

http://articles.sitepoint.com/article/hierarchical-data-database/2「データベースへの階層データの保存」に関する次の記事を読んでいます。

これはこれらの構造について話しています。http://sitepointstatic.com/graphics/sitepoint_numbering.gifおよびhttp://sitepointstatic.com/graphics/table02.gif

以下の文章がわかりません。これらはどういう意味ですか。

「ノードの子から始めるたびに、そのノードの正しい値をスタックに追加します。」

「ノードの表示が終了したら、スタックから正しい値を削除します。スタック内の要素を数えると、現在のノードのレベルが得られます。」

可能であれば、誰かがこれらをより簡単な方法で説明してくれることを願っています。

ツリー構造を示すために、子は親よりもわずかにインデントする必要があります。これは、正しい値のスタックを保持することで実現できます。ノードの子から開始するたびに、そのノードの正しい値をスタックに追加します。そのノードのすべての子には、親の正しい値よりも小さい正しい値があることがわかっているため、現在のノードの正しい値とスタック内の最後の正しいノードを比較することで、まだ正しいかどうかを確認できます。その親の子を表示します。ノードの表示が終了したら、その正しい値をスタックから削除します。スタック内の要素をカウントすると、現在のノードのレベルが得られます。

4

1 に答える 1

2

彼らは、ネストされたセットを使用して、ツリーのレベルごとにデータをインデントする方法を考え出そうとしています。

Food (1,12)
|
+--Fruit (2,11)
  |
  +--Red (3,6)
  | |
  | +--Cherry (4,5)
  |
  +--Yellow (7,10)
    |
    +--Banana (8,9)

rgtしたがって、行を取得するときに、配列の末尾に数値をプッシュします。

$right[] = $row['rgt'];

この配列は、子と子を処理するにつれて大きくなります。たとえば、"Cherry" に到達するまでに、配列は次のようになります。

array(11, 6, 5)

子の値は常に親の値よりも小さいため、ツリーの枝を下っていく限り、rgtこの値は小さくなるはずです。rgtrgt

次に処理する行は "Yellow" で、rgt値は 10 です。この値 10 は配列の最後の値よりも大きく、つまり、1 つのブランチを下っていくのではなく、別のブランチにいることを意味します。10 が配列の最後の数値より大きくなくなるまで、配列から数値をポップする必要があります。

array(11, 6) // 10 is still greater than 6
array(11)    // 10 is not greater than 11, so stop

これで、配列には現在の行「Yellow」の祖先のみが含まれていることがわかりました。

ツリーのレベルは、常にその配列の要素数と等しくなります。

于 2009-12-22T22:18:47.283 に答える