2016-10-12 13 views
2
void MovieTree::printMovieInventory(MovieNode* node) 
{ 
    if(node) 
    { 
     while(node->rightChild!=NULL or node->leftChild!=NULL) 
     { 
      std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl; 
      if(node->rightChild) 
      { 
       printMovieInventory(node->rightChild); 
      } 
      if(node->leftChild) 
      { 
       printMovieInventory(node->leftChild); 

      } 
     } 
    } 
    else 
    { 
     std::cout<<"No movies in list!"<<std::endl; 
    } 
} 

この機能が問題を引き起こしているのか、それとも私の機能を追加しているのか分かりませんが、これに対するロジックが正しいかのように感じます。何か不足していますか?バイナリ検索ツリーの内容を再帰的に出力しますか?

編集:: 私の問題は、それが無限ループが生じていますし、それが適切に機能におけるwhile

答えて

6

使用が間違っているツリーのすべての関連した子どもたちを印刷していないということです。それはifである必要があります。それ以外の場合は、ループがwhileループから抜けてしまうことはありません。それはdoesnの場合は、ノード自体を印刷しないよう、これはまた、リーフノードを印刷することはできません、whileループでの問題に加えて

void MovieTree::printMovieInventory(MovieNode* node) 
{ 
    if(node) 
    { 
     std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl; 
     printMovieInventory(node->rightChild); 
     printMovieInventory(node->leftChild); 
    } 
} 
3

FWIW、その機能がに簡素化することができます左か右のどちらかの子供がいる。

while(node->rightChild!=NULL or node->leftChild!=NULL) 
     { 
      std::cout<<"Movie:"<<node->title<<" "<<node->quantity<<std::endl; 

それはここでは物事の

if(node) 
    print node 
    if left 
     recurse left 
    if right 
     recurse right 
+0

これは良い点です。私はプレフィックス順で印刷しているのに対し、元のコードは後続の順番で印刷しています。手元にあるタスクにとってそれが重要かどうかは確かではありませんが、私はそれについて言及したいと考えました。 – user1118321

+0

@ user1118321元のコードは後置ですか?私はそれを見ていないよ。 – xaxxon

+0

申し訳ありません。プレ/ポストフィックスはありません。私が意味していたことは、元のコードが最初に右回帰してから左に回帰していたことです。もう一度 - それは何か違いがあるかどうかはわかりませんが、アプリケーションによっては違うかもしれません。 – user1118321

0

カップルでなければなりません。

私が理解しているコードから、あなたは予約注文の方法で印刷しようとしています。 Whileループは不要であり、無限ループを引き起こしているものです 2つのノードrootとroot-> leftを持つとします 関数はrootを出力し、関数を再帰的にroot '= root-> right root ' - > leftはNULL、root' - > rightはNULLなので今回は何も印刷しないでください)。次に、print(root ')関数は、呼び出し元のprint(root)に戻ります。今度は、While条件が常に真であるため、whileループから抜けることはありません。無限ループを実行してください。

あなたは単に「いいえ作品は」ちょうどこの再帰関数を印刷(ルート)を呼び出す前に、もしルート== NULLをチェックしない表示するには、この

Print(root) 
    cout << root; 
    if(root->right != NULL) 
     Print(root->right); 
    if(root->left != NULL) 
     Print(root->left); 

を行うことができます。

関連する問題