我一直在练习我的C++,因为它是从大学开始变得有点生疏,和我在哪里成员的值被尽快覆盖我的函数返回一个奇怪的问题。函数返回时会覆盖成员指针?
template <class T>
class BstNode
{
public:
T value;
BstNode<T>* left;
BstNode<T>* right;
BstNode<T>* parent;
BstNode()
{ left = right = parent = NULL; }
BstNode(T value)
{ this->value=value; left=right=parent=NULL;}
BstNode(T value, BstNode<T>* parent)
{ this->value=value; this->parent=parent; left=right=NULL;}
};
template <class T>
class BinarySearchTree
{
protected:
BstNode<T>* root;
void removeNode(BstNode<T>* node);
void addChild(T value, BstNode<T>* node);
BstNode<T>* find(T value, BstNode<T>* node);
public:
BinarySearchTree()
{ root = NULL; }
~BinarySearchTree()
{ removeNode(root); }
BinarySearchTree<T> insert(T value);
bool contains(T value);
BinarySearchTree<T> remove(T value);
void print();
BstNode<T>* getRoot() {return root;}
};
template <class T>
BinarySearchTree<T> BinarySearchTree<T>::insert(T value)
{
if (root == NULL)
{
root = new BstNode<T>(value);
}
else
{
addChild(value, root);
}
cout << "VAL: " << root->value << endl << "LEFT: " << root->left << endl << "RIGHT: "<< root->right << endl << "ADDR: " << root <<endl;
return *this;
}
template <class T>
void BinarySearchTree<T>::addChild(T value, BstNode<T>* node)
{
if (value > node->value)
{
cout <<"\tgt"<<endl;
if (node->right == NULL)
{
node->right = new BstNode<T>(value, node);
}
else
{
addChild(value, node->right);
}
}
else
{
cout<<"\tlte"<<endl;
if (node->left == NULL)
{
node->left = new BstNode<T>(value, node);
}
else
{
addChild(value, node->left);
}
}
}
// [other member functions]
int main()
{
BinarySearchTree<int> tree;
BstNode<int> *n;
n = tree.getRoot();
cout << "ADDR: " << n <<endl<<endl;
tree.insert(5);
n = tree.getRoot();
cout << "VAL: " << n->value << endl << "LEFT: " << n->left << endl << "RIGHT: "<< n->right << endl << "ADDR: " << n << endl;
return 1;
}
我的函数的输出是:
$ ./bst
ADDR: 0
VAL: 5
LEFT: 0
RIGHT: 0
ADDR: 0xa917c8
VAL: 11085080
LEFT: 0xa917a8
RIGHT: 0
ADDR: 0xa917c8
我不明白为什么在根节点的价值观改变,但指针在同一位置仍指向。我唯一能想到的是,根节点是在堆栈上创建的,而不是在堆中分配的,但是不能确保内存在C++中被正确分配?
你可以发布'addChild'吗?问题似乎存在 – JaredPar 2012-02-14 08:35:05
您的示例代码仅输出VAL一次。你从哪里得到第二个VAL输出? – HighCommander4 2012-02-14 08:36:12
一个来自main,另一个来自insert – Kristofer 2012-02-14 08:36:55