我正在尝试搜索二进制搜索树,并在遍历树时将每个节点存储在堆栈中,以便记住我的路径,以便我可以执行旋转。
这是我的代码:
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;
}
}
我认为问题是每次调用函数时堆栈都超出范围,所以当它找到我正在寻找的值时,它是唯一存储在堆栈中的东西。所以我的问题是,如何使堆栈包含我遍历的每一项而不是最后一项?
答案 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
类调用它。