2012-04-14 53 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只是根的一個副本,而不是對這個指針的引用。

相關問題