2016-09-10 1 views
0

私はアルゴリズムに近づく方法を知らない。 私はそのような何か考えていた:最小から最大まで2-3ツリーを印刷するには?

TreeNode n = root; 
while(n.first.first!=0){ 
    n=n.first; 
} // finding the leftMost parent 
//printing the first child key, then first num of parent, then second child.. and so on 

を誰かが良いアイデアを持っていますか?

+0

これはトップですか?上から下へ?深さは最初か幅が広い? –

+0

おそらくTreeSetのソースコードをチェックして、それがどのように反復しているかを確認し、そこから変更することができますか? –

+0

@NJDawson http://prntscr.com/cgcsi8そのようなツリーを想像すると、最小から最大までの値を印刷する必要があります – Blagch

答えて

1

2-3ツリーの定義によると、あなたは、ノードの3種類を満たすことができる:

    2人の子供と1つの値を持つ
  • 内部ノード
  • 3人の子供と2値と
  • 内部ノード
  • 子なし1または2の値の葉

その情報を持っていると、ルートノードから始まるノードを歩き回る再帰的な方法を使用できます。リーフノードを満たしていれば、単に値を出力します。他の場合、メソッドは、最も左のノード(左のノードにジャンプする)のために自身を呼び出す必要があり、次に最初の値を出力し、次のノードにジャンプします。その後、メソッドが終了し、アルゴリズム全体が終了する(実際のノードがルートノードである場合)か、親ノードに戻る(実際のノードが内部の子ノードである場合)

ここに擬似コードがあります。私はあなた自身のために実際の実装を残しました。デバッガを使用して実際のパラメータを追跡することができます。

/* you start algorithm by calling recursivePrint(root) */ 

void recursivePrint(node){ 

    if (node is a leaf){ 

     /* Here print node's value/values */ 

    } else if (node has 2 children){ 

     recursivePrint(node.leftChild); 
     /* Here print node's value */ 
     recursivePrint(node.rightChild); 

    } else if (node has 3 children) 

     recursivePrint(node.leftChild); 
     /* Here print node's left value */ 
     recursivePrint(node.middleChild); 
     /* Here print node's right value */ 
     recursivePrint(node.rightChild) 

    } 

    /* Shouldn't be other cases in 2-3 trees */ 
} 
+0

私はそれを得ました。もし私が注文3のBツリーを持っていれば、どういうわけか親にも行きますか? – Blagch

+0

どういう意味ですか? Bツリーの一般的なケースでは、上記のコードはあまり適切ではありませんが、少し変更するとうまくいくでしょう。概念は簡単です:まず、ノードrがc1参照(呼び出しメソッドrecursively 'recursivePrint(r.c1)')からサブツリーを処理し、次にk1の値を出力し、次にc2参照からサブツリーを処理し、次にk2の値を出力する次の値や参照があるまで(写真からの命名規則:[link](https://pl.wikipedia.org/wiki/B-drzewo#/media/File:B-tree-definition.png) )) –

関連する問題