2017-11-10 7 views
0

BSTのデータであるinorderを印刷しようとしています。これは単純な再帰で動作しますが、関数が呼び出しコードに戻る前に、印刷データの最後に改行を印刷する方法を理解できません。インラインツリートラバーサルのデータを1行にスペースで区切り、改行で終わり、改行で終わります。

/* Print data for inorder tree traversal on single line, 
* separated with spaces, ending with newline. */ 

void printTree(struct TreeNode* root) 
{ 
    if(root) 
    { 
    printTree(root->left); 
    printf("%d ", root->data); 
    printTree(root->right); 
    } 
} 
+0

はちょうど'のprintf( "\ n")を追加します。intは、あなたができるprintTree()戻ってあなたの関数、言いますか? [mcve]が必要です – Stargateur

+1

'printtree()'の直後に 'printf(" \ n ");'文を追加できます。 –

+0

詳しい情報をご提供ください。さらに、基本ケースのステートメントを追加することもできます。すべての葉ノードの後に​​改行を印字します。 (これがあなたがやっていることなら) – Neha

答えて

1

あなたはすべての再帰呼び出しが完了した後に改行を印刷するヘルパー関数を使用することができます。

void printTreeHelper(struct TreeNode* root) 
{ 
    if(root) 
    { 
    printTreeHelper(root->left); 
    printf("%d ", root->data); 
    printTreeHelper(root->right); 
    } 
} 

void printTree(struct TreeNode *root) 
{ 
    printTreeHelper(root); 
    printf("\n"); 
} 
+0

これはうまくいった!ありがとう! –

0

最も簡単な方法は、あなただけの関数を呼び出した後に改行を印刷することができます。

もう1つの簡単な方法は、2つの機能を持つことです。新しい機能は、あなたが最初に呼び出す機能です。新しい関数の中で、実装した関数を呼び出します。その後、改行を印刷します。

のようなもの:あなたはこのように、マクロを書くことができ

void TreePrinter(){ 
    PrintTree() 
    print the newline 
} 
+0

上記をご覧ください、ありがとうございます! –

-1

#define PRINT_NEWLINE_AFTER_CALL(x) x,printf("\n") 

とこのようにそれを使用する:あなたの関数が値を返す場合

PRINT_NEWLINE_AFTER_CALL(printTree(root)); 

を、このマクロでは、その戻り値も受け取ることができます。最後に `;

int retval = PRINT_NEWLINE_AFTER_CALL(printTree(root)); 
+0

Downvoter:説明する気には、なぜか? –

+0

問題があるので、私はそれが好きではありません。 'if(y)PRINT_NEWLINE_AFTER_CALL(printTree(root));'は動作しません。マルチラインマクロを使用する必要がある場合、それを 'do ... while(0)'ループで囲むことを検討してください。 https://stackoverflow.com/questions/923822/whats-the-use-of-do-while0-when-we-define-a-macro – MFisherKDX

+0

@MFisherKDX:私はdo {..}で囲むことは考えていませんでした。 while(0) 'はマクロが関数呼び出しに展開され、' do {..} while(0) 'で囲まれていると関数の戻り値を受け取ることができないためです。私が知っている質問では、 'printTree()'の戻り値の型は 'void'ですが、一般的な方法でマクロを書き込もうとしましたので、ある値を返す再帰関数で使うことができます。私は訂正しました、あなたがそれを好きであることを願ってください –

関連する問題