Оригинальный ответ:
Может ли быть так, что узел 4
в стеке имеет другой узел 6
справа (тот, с узлом 7
справа), чем узел 6
(с узлом 8
справа) вы работаете над? Вы можете сравнить их адреса, чтобы убедиться, что у вас нет двух разных копий узла 6
вокруг.
Разработка приведенного выше аргумента:
Давайте посмотрим на подпись вашего метода:
void Avltree::attachwithtree(treeNode* tree, Stack<treeNode>&s)
s
определяется как ссылка на Stack<treeNode>
.
Может быть, это Stack<treeNode*>
?
В зависимости от вашего treeNode
класса, возможно, что когда вы помещаете X
в этот стек, вы на самом деле получаете копию X
, а не X
. Точно так же, когда вы вытаскиваете из стека, вы на самом деле можете получить не элемент, который вы нажали, а его копию идентичного вида!?
Это будет означать, что в то время, когда вы помещаете узел 6
в стек, его правый дочерний элемент - это узел 7
. Но вы поместили новый, идентичный узел в стек. Даже если вы извлечете этот элемент из стека и измените его, вы только измените копию и оставите исходный узел дерева, как это было раньше.
Следовательно, вы будете работать с разными копиями узла 6
. Сначала вы извлекаете копию из стека и добавляете дерево в качестве его правого потомка. Проверка этого даст правильный результат.
Затем вы извлекаете копию узла 4
из стека. Правильный дочерний элемент - это узел 6
, как и ожидалось, НО не тот, который вы только что изменили, а оригинал! Поэтому вы получаете 7
на правой стороне узла 6
.
Демонстрируя разницу между передачей по значению и передачей по ссылке:
Хорошо, вот что вам нужно понять при работе с указателями или ссылками. В основном это показывает разницу между передачей параметра по значению (будет создана копия) или передачей по ссылке (копия не будет создана).
Внимательно изучите его, а затем посмотрите, как оно подходит к вашей проблеме.
#include <iostream>
class someObject
{
private:
int _value;
public:
someObject(int value) : _value(value) { }
int getValue()
{
return _value;
}
};
void someFunction(someObject objCopy, someObject* objPtr)
{
std::cout << "objCopy.getValue() -> " << objCopy.getValue() << std::endl;
std::cout << "objPtr->getValue() -> " << objPtr->getValue() << std::endl;
if ( &objCopy != objPtr )
{
std::cout << "objCopy is not actually *objPtr but a copy of it." << std::endl;
}
else
{
std::cout << "objCopy and *objPtr are one and the same object." << std::endl;
}
}
int main()
{
someObject X(17);
someFunction(X, &X);
return 0;
}
Подсказка : Да, в вашем методе pop
вы работаете с указателями, но, скорее всего, с указателем на копию объекта, первоначально помещенного в стек.