2016-11-25 5 views
2

the Homespring proposed language standardによると、上流のサーモンは、魚のチックアップ(セクション6.4.2)の「川システムの順不同検索...鮭と同じ名前の川ノードを見つける」必要があります。問題は、川のノードがn個のツリーに格納されていることです。そのため、このツリーを順番に検索する方法がわかりません。 Google検索では何も関係がなくなり、Wikipediaのページにはどんな種類のトラバーサルも言及されていません。 k-aryツリーを順番にトラバースすることは可能ですか?k-aryツリーを順番にトラバースすることは可能ですか?

答えて

2

はい、実際にこれを行うことができます!類推によって理由を考えましょう。バイナリツリーでは、ノードは次のようになります。

  +---+ 
      | v | 
      +---+ 
     / \ 
      T0  T1 

トラバーサルが、その後のように行われるINORDERは次のとおりです。

  1. は、再帰的にT0のINORDERトラバーサルを行う
  2. が再帰的に行う訪問のV
  3. T1のインオーダートラバーサル。

言い換えれば、値を左から右に移動すると想像することができます。掃引は最初にT0に当たってからvをヒットし、T1にヒットします。

+----+----+----+ ... +----+ 
    | v0 | v1 | v2 | ... | vn | 
    +----+----+----+ ... +----+ 
/ | | |  |  \ 
    T0 T1 T2 T3 Tn  Tn+1 

我々はここで、「左から右にスイープ」のアイデアを使用している場合は、我々はこれを行うだろう:

多分木中のノードが次のようになります

  1. は、再帰的に行いますT0のインオーダーウォーク
  2. v0をご覧ください。
  3. T1のインオーダーウォークを再帰的に行います。
  4. v1をご覧ください。
  5. ...
  6. Tnのinorder walkを再帰的に行います。
  7. vnをご覧ください。
  8. Tn + 1のインオーダーウォークを再帰的に行います。ここで

は、このためのいくつかの擬似コードです:

void inorderWalk(Node* v) { 
    if (v == null) return; 

    for (int i = 0; i < v.numChildren; i++) { 
     inorderWalk(v.child[i]); 
     visit(v.value[i]); 
    } 
    inorderWalk(v.child[v.numChildren]); 
} 
+1

したがって、各ノードに関連付けられている唯一の値がある場合は、その値が複数回訪問していますか? – Ontonator

+0

@Ontonatorそのような場合、「inorder traversals」について話すのはもう少し難しいです。あなたが探しているかもしれないオイラーツアーと呼ばれる関連するトラバーサルオーダーがありますか? – templatetypedef

+0

サーモンは同じ名前のノードの*最初の出現に向かうので、それはそうではないと思うので、検索はプリオーダー検索と同等に終わるでしょう。とにかく、これは私たちが適切な解決策を得るために最も近いと思うので、正しいものとしてマークしました。 – Ontonator

関連する問題