在递归函数中存储堆栈

时间:2011-03-29 20:08:51

标签: c++ recursion binary-tree

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

这是我的代码:

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

通常会发生一个私有的重载,它引用了原始被调用函数的本地堆栈上的堆栈。

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

答案 2 :(得分:0)

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