繁体   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