簡體   English   中英

以遞歸方式打印二進制搜索樹的內容?

[英]printing the contents of a Binary Search Tree recursively?

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是錯誤的。 它必須是if 否則,該函數永遠不會中斷while循環。

FWIW,該功能可以簡化為:

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

除了while循環的問題之外,這也可能永遠不會打印葉節點,因為如果它沒有左子節點或右子節點,則不打印節點本身。

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

這里的情侶。

從我理解的代碼,你試圖以預購方式打印。 While循環是不必要的,這是導致無限循環的原因讓我們說你有兩個節點root和root-> left你的函數將打印root,在root'= root-> right上遞歸調用函數(不會打印任何這個時間因為root' - > left為NULL而root' - > right為NULL)。 然后函數print(root')返回其調用者print(root)。 這次它不會退出while循環,因為while條件總是正確的,因此無限循環。

你可以簡單地做到這一點

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

要顯示“No Movies”,只需檢查root == NULL,然后再調用此遞歸函數Print(root);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM