这里是情况:
给出一个指向二进制搜索树的根的指针(整数)
root
和一个整数data
,对所有包含rotate
的节点的祖先节点使用迭代方法。为简单起见,假设data
存在并且始终在叶子节点上发生。
data
函数通过引用按如下方式传递指针:
rotate
迭代版本需要使用堆栈。 struct Node
{
Node *left;
int data;
Node *right;
};
void rotate(Node* &root); // performs some rotation on the root and reflects the change.
void search(Node* &root, int data)
{
stack<Node*> s;
while(root->data!=data)
{
s.push(root);
if(data<root->data)
root=root->left;
else
root=root->right;
}
while(!s.empty())
{
rotate(s.top()); // does not reflect changes to root
s.pop();
}
}
函数按值推动指针。结果,当弹出祖先指针时,我将在堆栈中反映更改。
这种情况下最好的解决方法是什么?
std::stack::push()
您想潜在地修改搜索中r的值,但是使用类似的堆栈来松开对r的引用,则需要保存指向Node指针的地址。一种方法是:
Node * r = ...; search(r);