以递归方式打印二进制搜索树的内容?

时间:2016-10-12 03:31:15

标签: c++ debugging recursion binary-search-tree

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;
    }
}

我不确定这个功能是否导致了我的问题,或者它是否是我的添加功能,但我觉得这个逻辑是正确的。我错过了什么吗?

编辑:: 我的问题是,它导致无限循环并且无法正确打印树的所有相关子项

3 个答案:

答案 0 :(得分:6)

在函数中使用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);
   }
}

答案 1 :(得分:3)

除了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

答案 2 :(得分:0)

这里的情侣。

根据我的理解,您正在尝试以预购方式进行打印。 While循环是不必要的,这就是导致无限循环的原因 假设你有两个节点root和root-&gt; left 你的函数将打印root,在root&#39;上递归调用函数= root-&gt; right(这次不会打印任何内容,因为root&#39; - &gt; left为NULL而root&#39; - &gt; right为NULL)。然后函数print(root&#39;)返回其调用者print(root)。这次它不会退出while循环,因为while条件总是正确的,因此无限循环。

你可以简单地做到这一点

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

显示&#34;没有电影&#34;在调用此递归函数Print(root);

之前,只检查root == NULL