2012-03-25 7 views
1

BST印刷に関する質問があります。私は別のツリー印刷アルゴリズムを使用して横にツリーを印刷することができました。しかし、私は常にツリーを左から右に印刷します。木を上下に逆さまに印刷する方法はありますか?私はXYを使用することについていくつかのアイデアを見ましたが、私はコンソールでそれをしたくないので、同じことを達成するための方法がありますか?BST横から上から下へ印刷

編集:例えば、私はL、トラバーサル順序どおり使用して、M、R、T、S、G、Y、S、D、E、C、Aと入力を有し、私はこの入力を

   Y 
      T 
       S 
     R 
    M 
L 
    G 
      E 
     D 
      C 
      A 
を得

私が望むのは、この90度を右に回転させるのと同じことです.Lは上に、次に他のものが続く必要があります。

編集2:レベルオーダーを使用してツリーを印刷するコードはここにありますが、フォーマットをどのように表示するかはわかりません。

queue<TreeNode*> q; 

while(node != NULL) 
{ 
    cout << node->data << " " << endl; 
    if (node->left) 
     q.push(node->left); 
    if(node->right) 
     q.push(node->right); 
    if(!q.empty()) 
    { 
     node = q.front(); 
     q.pop(); 
    } 
    else 
     node = NULL; 
} 
+0

ツリーの実装では、親ノードへのリンクがありますか?もしそうなら、私はこれを行うことが可能であるべきだと思います。そうでなければ、通常のプリントを実行して配列にそれらの値を格納し、それを逆方向にトラバースすることができます(これはかなり効率が悪くなります)。 – twain249

+0

"逆さま"とはどういう意味ですか? –

+0

はい左右のポインタがあります。 – Spincel

答えて

0

Breadth-First Searchを意味しますか?

+0

私はそれを試しましたが、私が望むようにキューからデータをどのように正確に表示できるかわかりません。 – Spincel

0

どのように手作業で行いますか?それが本当の質問です。 C++コードはすべてのステップを書き留めています。私のアプローチは、最上部のノードLを中央に印刷することです。その前に40スペースを入れてください。 2番目のレベルのノードでは、20(G)、次に40(M)のスペースを使用して印刷します。第3レベルでは、10スペース、次にC、次に20スペースなどを印刷します。

Ie.深度Dでは、私は2 Dの要素を印刷する必要があるので、それぞれがlinewidth>>Dの幅になります。

0

ここは私のコードです。それは非常によく、おそらく完全に対称ではないでしょう。 少し説明:

  • 1機能 - レベルによってプリントレベル(ルートLV - >葉LV)
  • 2機能 - 新しい行
  • 3関数の先頭からの距離 - プリントノードとの間の距離を算出します2枚のプリント。

void Tree::TREEPRINT() 
{ 
    int i = 0; 
    while (i <= treeHeight(getroot())){ 
     printlv(i); 
     i++; 
     cout << endl; 
    } 
} 

void Tree::printlv(int n){ 
    Node* temp = getroot(); 
    int val = pow(2, treeHeight(root) -n+2); 
    cout << setw(val) << ""; 
    prinlv(temp, n, val); 
} 

void Tree::dispLV(Node*p, int lv, int d) 
{ 
    int disp = 2 * d; 
    if (lv == 0){ 
     if (p == NULL){ 

      cout << " x "; 
      cout << setw(disp -3) << ""; 
      return; 
     } 
     else{ 
      int result = ((p->key <= 1) ? 1 : log10(p->key) + 1); 
      cout << " " << p->key << " "; 
      cout << setw(disp - result-2) << ""; 
     } 
    } 
    else 
    { 
     if (p == NULL&& lv >= 1){ 
      dispLV(NULL, lv - 1, d); 
      dispLV(NULL, lv - 1, d); 
     } 
     else{ 
      dispLV(p->left, lv - 1, d); 
      dispLV(p->right, lv - 1, d); 
     } 
    } 
} 

入力:

50-28-19-30-29-17-42-200-160-170-180-240-44-26-27 

出力:https://i.stack.imgur.com/TtPXY.png

関連する問題