【问题标题】:Storing a stack in a recursive function在递归函数中存储堆栈
【发布时间】:2011-07-25 14:23:09
【问题描述】:

我正在尝试搜索二叉搜索树并将每个节点存储在堆栈中,因为我遍历树以便记住我的路径,以便我可以执行旋转。

这是我的代码:

template <typename T>
bool BST<T>::contains(const T& v, BSTNode *&t)
{
   stack<BSTNode*> s;
   BSTNode * g;
   BSTNode * p;

   if( t == NULL )
        return false;
   else if( v < t->element ){
        s.push(t);
        return contains( v, t->leftChild);
   }

   else if( v > t->element ){
        s.push(t);
        return contains( v, t->rightChild);
   }
   else
   { 
   t->search_c += 1;

   if(t->search_c > threshold)  //we need to rotate
   {//begin rotation

   cout << s.size();  //outputs 1


   }//end rotation

   return true;
   }
}

我认为问题在于每次调用函数时堆栈都会超出范围,因此当它找到我要查找的值时,它是唯一存储在堆栈中的东西。所以我的问题是,如何使堆栈包含我遍历的每个项目,而不仅仅是最后一个?

【问题讨论】:

  • 你能让堆栈成为静态变量吗?还是将堆栈作为参数传递给函数?
  • 你能把堆栈作为第三个参数传递吗?当然是参考;)

标签: c++ recursion binary-tree


【解决方案1】:

将(非常量)引用与其他参数一起传递给堆栈。 您最初可能需要一个“设置”函数来创建堆栈。

【讨论】:

  • 我正在尝试设置它
  • 好吧,我在这里搞砸了。我制作了我的函数原型bool contains(const T&amp; v, BSTNode *&amp;t, stack&lt;BSTNode*&gt; &amp;s); 和另一个调用“包含”的函数,它有stack&lt;BSTNode*&gt; s; return contains(v, root, s); 但它给了我一个错误,说没有匹配的原型
  • 可能是某个地方的错字。你能用你到目前为止的进展和完整的编译器错误消息更新你的问题吗(通常包含关于什么是错误的线索)
  • 抱歉回复时间长,没想到要接班上的朋友。我发现我的头文件中没有#include &lt;stack&gt;,新手错误大声笑,但是通过引用传递,堆栈现在可以正常运行。感谢您的帮助。
【解决方案2】:

看起来您需要使堆栈成为该类的成员,或者将您的contains 方法和堆栈提取到一个新类中,从BST 类中调用它。

【讨论】:

    【解决方案3】:

    通常发生的情况是您创建了一个私有重载,该重载引用了原始调用函数的本地堆栈上的堆栈。

    template<typename T> class BST {
    public:
        bool contains(const T&, BSTNode*&);
    private:
        bool contains(const T&, BSTNode*&, stack<BSTNode*>&);
    };
    

    【讨论】:

    • 我认为第二种方法应该是... stack&lt;BSTNode*&gt;&amp;);
    猜你喜欢
    • 2023-03-27
    • 2018-10-03
    • 2017-09-12
    • 2020-08-27
    • 1970-01-01
    • 2018-09-24
    • 2017-10-20
    • 2019-09-30
    相关资源
    最近更新 更多