我正在定义一个像这样的二叉搜索树类:
template <class T>
class BSTNode
{
public:
BSTNode(){
right = left = 0;
}
BSTNode(const T& el, BSTNode * l = 0, BSTNode * r = 0)
{
val = el; left = l; right = r;
}
T val;
BSTNode * right;
BSTNode * left;
};
template <class T>
class BST
{
public:
BST(){ root = 0;}
void Insert(const T& el);
private:
BSTNode<T> * root;
};
我实现Insert()
函数,如下所示:
template <class T>
void BST<T>::Insert(const T& el)
{
bool bEqual = false;
BSTNode<T> * p = root;
while(p)
{
if(el == p->val)
{
bEqual = true;
return;
}
if(el < p->val)
{
// go left
p = p->left;
}
if(el > p->val)
{
// go right
p = p->right;
}
}
if(!p)
{
std::cout << "creating new node " << el << "\n";
p = new BSTNode<T>(el);
}
}
为什么root
指针变量保持为0,而不是新对象的地址?
答案 0 :(得分:2)
您的代码中永远不会root = ?;
;另外,p = new BSTNode<T>(el);
泄漏记忆。
我的猜测是你希望p
成为指针的引用,所以你可以改变原始指针。
BSTNode<T> *& p = root; // watch out, it won't solve anything
但是,在这种情况下,p
不可重新分配。您可能想要检查分配给p
的指针是否为空,只是将新值插入正确的位置(例如p->left = new BSTNode<T>(el);
)并仅在给定指针不为空时重新分配p
。
我的意思是:
template <class T>
void BST<T>::Insert(const T& el)
{
bool bEqual = false;
BSTNode<T> * p = root;
if (p == 0)
{
root = new BSTNode<T>(el);
return;
}
while(true)
{
if(el == p->val)
{
bEqual = true;
return;
}
if(el < p->val)
{
if (p->left == 0)
{
p->left = new BSTNode<T>(el);
return;
}
p = p->left;
}
if(el > p->val)
{
if (p->right == 0)
{
p->right = new BSTNode<T>(el);
return;
}
p = p->right;
}
}
}
答案 1 :(得分:1)
因为在构造对象
声明
p= root
将p初始化为空指针..
您创建一个新对象并将其地址传递给p而不是root ...
事情是p只是root的副本而不是对这个指针的引用..