2012-04-14 56 views
1

我定义一个二叉搜索树类是这样的:为什么这个指针没有被分配给一个新的对象?

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,而不是新对象的地址?

+1

你不会在任何地方做'root =?;'为什么它会改变? – Griwes 2012-04-14 16:42:08

回答

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; 
    } 
    } 
} 
+0

不,我从来没有打算'p'实际上是一个指针的引用。但是,“小心,它不会解决任何问题”是什么意思?你是说这是因为引用'p'已经被实例化为'root'并且不可重定义? – BeeBand 2012-04-14 17:08:31

+0

@BeeBand,你原来的代码假设你做'p = p-> left; p = new BSTNode (el);',那么原来的'p'的'left'也会被改变;该功能是引用的功能,所以你的代码假设指针实际上是对指针的引用。对于你的问题的第二部分:是的;你不能'BSTNode *&p = root; p = p-> left;',因为你不能重新分配参考。要使原始算法有效,你必须使用指针指针 - 我个人更喜欢我的方式。 – Griwes 2012-04-14 17:18:50

+0

re。更喜欢,也是我。 – BeeBand 2012-04-14 17:26:16

1

因为对象

声明

p= root 

初始化P作为空指针的建设中..

您创建一个新的对象并将其地址传递给p而不是根...

事情是p只是根的一个副本,而不是对这个指针的引用。

相关问题