2014-10-02 44 views
0

我想使用二叉樹集中添加元素:C++:我的新節點在哪裏?

bool TreeSet::add(const string &str) 
{ 
    if (treesize == 0) 
    { 
     TreeNode->data = str; 
     treesize++; 
     return true; 
    } 
    else 
    { 
     if (str < TreeNode->data) 
      return insert(TreeNode->left, str); 
     else if (str > TreeNode->data) 
      return insert(TreeNode->right, str); 
     else 
      return false; 
    } 
    return false; 
} 

bool TreeSet::insert(TREE *node, const string &str) //private 
{ 
    if (node == NULL) 
    { 
     node = new TREE; 
     node->data=str; 
     node->left = NULL; 
     node->right = NULL; 
     treesize++; 
     return true; 
    } 
    else 
    { 
     if (str < node->data) 
      return insert(node->left, str); 
     else if (str > node->data) 
      return insert(node->right, str); 
     else 
      return false; 
    } 
    return false; 
} 

正如你所看到的,我要初始化插件的內部樹結構,當我完成這樣做,我想將它與鏈接樹的左或右節點。

但是,當我gdb這個,只能構建1層樹(頂層),*left*right節點是NULL無論我試圖添加多少字符串。爲什麼?

我的樹是:

typedef struct tree 
{ 
    string data; 
    tree *left; 
    tree *right; 
} TREE; 
+0

可能你有一些[三](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)問題。 – 2014-10-02 17:17:58

回答

6
bool TreeSet::insert(TREE *node 

應該

bool TreeSet::insert(TREE *&node 

指針也可以通過引用傳遞的,如果你打算直接修改它們應該的。否則你通過複製傳遞,你現在有兩個指針指向同一個位置。當您使用複製一個new了一些數據,它指向一個新的存儲位置,讓你的原始指針仍NULLnullptr在C++ 11)


在一個側面說明,當樹被構建,你應該(在C++ 11 nullptr)初始化leftrightNULL

typedef struct tree 
{ 
    string data; 
    tree *left; 
    tree *right; 
    tree():left(NULL),right(NULL){} 
} TREE; 
+0

謝謝。我有它的類構造函數初始化爲NULL。 – hlx98007 2014-10-02 17:28:56

2

當你傳遞一個指針這樣的功能insert參數:

bool TreeSet::insert(TREE* node, const string& str); 

然後指針是複製到參數node。指向node的其他東西只指向指針的本地副本。傳遞給來自呼叫站點的函數的指針是未更改

node = new TREE; // Points local variable 'node' to newly allocated data. 
       // When the function goes out of scope 'node' will be destroyed 
       // and the memory will be leaked. 

要更改原來的呼叫現場指針指向,通過參考取參數(或增加一個間接的另一個層面):

bool TreeSet::insert(TREE*& node, const string& str); 

通過引用進行參數,你要確保您正在訪問呼叫站點變量而不是本地副本。