2011-01-27 3 views
8

の更新:
私はやってのけるしようとしているものの例のより多くのを発見した:Managing Hierarchical Data in MySQL。私はそれをやりたいのですが、JavaScriptで、私は階層構造のコメントを取るアプリケーションを構築しています。具体的にはreddit.comです。あなたのクロムWebブラウザにPretty JSON拡張機能がある場合、redditに行き、スレッドのコメントをクリックし、urlに.jsonを追加して、私が解析しているものを見てください。
私はJSONデータをちょうどいいと思っています。ちょうどコメントを解析し、適切なHTMLを追加してそのネストしたことを示します。
ソリューションのアイデアですか?アルゴリズムツリートラバーサル


OLD質問:
私はプログラムに取り組んでいると私は私がコードを書く前にロジックを把握する必要があり一部になってきました。 私はツリー形式のデータを取り込んでいますが、親ノードごとに複数の子が存在する可能性があり、唯一のツリーのデータは重み付けやツリーのデータであり、各ノードに最大2つの子ノードがあります。だから私は、このようなツリーの各ノードを評価するためのアルゴリズムを把握しようとしている:私は私のアルゴリズムがどのように機能するかを書き出すしようとすると、

startingParent[15] // [# of children] 
    child1[0] 
    child2[5] 
     child2ch1[4] 
     ... 
     child2ch5[7] 
    child3[32] 
    ... 
    child15[4] 

は、今私はのために/ whileループネストされたが、私の書き込みに終わりますツリーの高さの各レベルのループを作成することになります。これは動的なデータとツリーの未知の高さであり、ノードあたりの未知数の子がありません。これは動作しません。私はある時点で、このような木を横切る方法を学んだが、今は完全に逃げ出していることを知っている。ループの面でこれがどのように行われるのか誰でも知っていますか?

答えて

15

再帰を使用しない場合は、補助データ構造が必要です。キューは幅優先トラバーサルを与えますが、スタックは深さ優先トラバーサルを与えます。それはおおよそ次のようになりますいずれかの方法:それは宿題ではないと、彼は間違いなく、DFSを望んでいる場合

structure <- new stack (or queue) 
push root onto structure 
while structure is not empty 
    node <- pop top off of structure 
    visit(node) 
    for each child of node 
    push child onto structure 
loop 

ウィキペディアは

8

ループではなく再帰を使用します。 Breadth first search
Depth first search
もの
はあなたが

+0

を参照します。彼は具体的にループでそれをやる方法を求めました。いずれの方法でも、BFSは再帰でうまくいっていません。 –

+0

さて、これは宿題ではありません。これはビルドしているアプリのためのものです。リストにはコメントページのようなものがありますので、回答レベルがあります。主なコメント、返信、返事の返信などだから私はコメントを解析し、構造のための適切なHTMLを構築する方法を探していました。 – HuXu7

1

ちょうど

def travel(node): 
    for child in node.childs: 
     # Do something 
     travel(child) 
+1

ほんの少しの微調整ですが、通常は "何か"がそのループの外側にあるためにはかなりクリーンです。この方法では、ルートノードが失われます。 –

1

最もツリートラバーサルのための最も簡単なコードは通常、再帰的であるように再帰を使う達成しようとしているもので始めるのに役立つはずです。あなたのような多方向のツリーの場合、子への各ポインタを見て、すべての子ノードに対してそのノードを引数として呼び出すループを持つのが最も簡単です。