【问题标题】:printing the contents of a Binary Search Tree recursively?递归打印二叉搜索树的内容?
【发布时间】:2016-10-12 03:31:14
【问题描述】:
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;
    }
}

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

编辑:: 我的问题是它导致了一个无限循环,并且它没有正确打印树的所有相关子节点

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是一个很好的观点。我注意到您是按前缀顺序打印的,而原始代码是按后缀顺序打印的。不确定这对手头的任务是否重要,但我想我会提到它。
      • @user1118321 原始代码是后缀?我没看到。
      • 对不起 - 不是前置/后缀。我的意思是原始代码是先右后左递归,而你的先左后右。再一次 - 不确定它有什么不同,但它可能取决于应用程序。
      • @user1118321 虽然它不在这种情况下,但我很好奇它会如何产生影响!请告诉我!
      • 假设您有一个解析树,其中节点可以是运算符或操作数。如果您有“减”运算符,则操作数的顺序很重要。我不知道打印这棵树是否用于排序(例如字母顺序),但如果是这样,那也会有所作为。 (尽管在这种情况下,您必须在左右之间打印当前节点。)
      【解决方案3】:

      这里有几件事。

      据我了解,您正在尝试以预订方式打印。 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);
      

      要显示“无电影”,只需在调用此递归函数 Print(root) 之前检查 root == NULL;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        • 2021-07-03
        • 2019-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        相关资源
        最近更新 更多