2013-02-18 173 views
0

最近我開始玩弄C++,即類和指針。我環顧四周尋找類似的問題,但沒有任何幫助。C++二叉搜索樹

我有一個二進制搜索樹類,它以字符串格式(好,char *)保存一些信息,但是在向樹添加一個新節點後,我無法獲取信息,因爲它返回垃圾。

這裏是我的代碼如下所示:

class Node 
{ 
    Node *lNode; 
    Node *rNode; 
    char *name; 
    public: 
     void setName(char *n) { name = n; } 
     char *getName() { return name; } 
} 

class Tree 
{ 
    Node *root; 
    Node *addNode(Node *, Node *); 
    public: 
     Tree() { root = NULL }; 
     int addNewNode(Node *); 
     void print(); 
}; 

int Tree::addNewNode(Node *n) 
{ 
    root = addNode(root, n); 
    cout << root->getName() << endl; // this returns the name correctly 
} 

Node *Tree::addNode(Node *subtree, Node *node) 
{ 
    if(subtree== NULL) 
    { 
     subtree = node; 
    } 
    else if(node->getName() <= subtree->getLeft()) 
    { 
     subtree->setLeft(addNode(subtree->getLeft(), node)); 
    } 
    else 
    { 
     subtree->setRight(addNode(subtree->getRight(), node)); 
    } 

    return subtree; 
} 

void Tree::print() 
{ 
    cout << root->getName() << endl; // this does not! 
} 

而這正是我所說的方法:

Tree *myTree = new Tree(); 

Node *n = new Node(); 
n->setName(name); 
myTree->addNewNode(n); 

樹變量是外部容器類的私有成員屬性,實際上是在該類之外創建的,並傳遞給構造函數。當我調用addNewNode方法時,它向樹添加了一個節點,但是當我想打印出存儲在根節點中的節點的名稱時,它只是出現垃圾。我想這裏有一個干擾指針,但是我無法在我的生活中找到它。

任何幫助將不勝感激。

+2

爲什麼不使用'std :: map'或'std :: set'? – 2013-02-18 18:40:10

+0

請勿用與您的成員相同的名稱命名參數。你會犯這樣的錯誤...... – 2013-02-18 18:41:30

+0

這對我來說很愚蠢。將其更改爲'子樹',但仍然相同。 – straphe 2013-02-18 18:42:37

回答

0

我猜你正在傳遞一個字符串指針名稱爲setName,只是將指針複製到name(而不是重新分配和保存字符串)。之後,原始對象消失了,您的對象name仍然指向垃圾。相反,嘗試使用std :: string代替name,或者使用name = new char[ strlen(n) + 1 ]和strcpy/memcpy創建自己的內存。不要忘記在對象銷燬時使用delete [] name

+0

而且修復了它。非常感謝你。我仍然需要圍繞一些變量的範圍。非常感謝。 :) – straphe 2013-02-18 18:52:18

0

當root爲空時,將其設置爲城市而不是節點。這是你的問題。