2013-02-18 4 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, который добавляет узел в дерево, но когда я хочу распечатать имя узла, хранящегося в корне, он просто появляется с барахлом. Наверное, где-то есть указатель haywire, но я не могу найти его для жизни.

Любая помощь была бы принята с благодарностью.

+2

Почему вы не используете 'std :: map' или' std :: set'? –

+0

Не указывайте свой параметр с тем же именем, что и ваш член. Вы сделаете ошибку, сделав это так ... –

+0

Это было глупо со мной. Изменено это на «поддерево», но все равно. – straphe

ответ

0

Я предполагаю, что вы передаете имя указателя строки на setName и просто копируете указатель на name (в отличие от перераспределения и сохранения строки). Позже исходный объект исчез, и ваш объект name оставлен, указывая на мусор. Попробуйте вместо этого использовать std :: string для name или создайте свою собственную память с помощью name = new char[ strlen(n) + 1 ] и strcpy/memcpy. И не забывайте delete [] name при уничтожении объекта, если вы идете по этому маршруту.

+0

И это исправлено. Большое спасибо. Мне все еще нужно обернуть голову вокруг объема некоторых переменных. Огромное спасибо. :) – straphe

0

Когда root равно null, вы устанавливаете его в город, а не в узел. Там твоя проблема.

Смежные вопросы