2016-05-18 3 views
0

Итак, я тестировал класс узла дерева и столкнулся с некоторыми ошибками. Я думаю, это потому, что я использую частные члены узла и использую функции доступа для доступа к ним. Используя функцию del, я попытался напечатать и удалить тестовое дерево при обходе PostOrder, но нет выхода, кроме «root».Ошибка с узлом класса дерева, возможно, из-за частных членов узла

#include <iostream> 
#include <string> 
using namespace std; 

#ifndef TREENODE_H 
#define TREENODE_H 
template <class T> 
class TreeNode 
{ 
private: 
    typedef TreeNode<T>* nodePtr; 
    T data; 
    nodePtr lst; 
    nodePtr rst; 
public: 
    TreeNode() 
    { 
     lst = NULL; 
     rst = NULL; 
    }; 
    TreeNode(T d) 
    { 
     data = d; 
     lst = NULL; 
     rst = NULL; 
    }; 
    TreeNode(const TreeNode<T>* other) 
    { 
     data = other.data; 
     lst = other.lst; 
     rst = other.rst; 
    }; 

    void setData(T d) 
    { 
     data = d; 
    } 

    T getData() 
    { 
     return data; 
    } 

    void setLeft(nodePtr l) 
    { 
     lst = l; 
    } 

    void setRight(nodePtr r) 
    { 
     rst = r; 
    } 

    nodePtr getLeft() 
    { 
     return lst; 
    } 

    nodePtr getRight() 
    { 
     return rst; 
    } 

    ~TreeNode() 
    { 
     cout << "gone: " << data; 
    } 
}; 
#endif 

И

#include <iostream> 
#include <string> 
#include "TreeNode.cpp" 

using namespace std; 



void recInsert(string a, TreeNode<string>* current) 
{ 
    if (current == NULL) 
    { 
     current = new TreeNode <string> ; 
     current->setData(a); 
     current->setLeft(NULL); 
     current->setRight(NULL); 
    } 
    else if (a <= current->getData()) 
     recInsert(a, current->getLeft()); 
    else recInsert(a, current->getRight()); 
}; 

void del(TreeNode <string> *current) 
{ 
    if (current != NULL) 
    { 
     del(current->getLeft()); 
     del(current->getRight()); 
     cout << current->getData(); 
     delete current; 
    } 
} 

int main() 
{ 
    TreeNode<string>* a; 
    a = new TreeNode <string>; 
    a->setData("hi"); 
    recInsert("ho", a); 
    recInsert("bo", a); 
    recInsert("ao", a); 
    recInsert("lo", a); 
    del(a); 
} 

ответ

0

Затем вы пытаетесь добавить левый или правый потомок вашей recInsert функции получает указатель на узел, а не указатель на указатель или ссылку на указатель. Таким образом, вы изменяете параметр функции вместо дочернего узла. Вот быстрое решение:

void recInsert(string a, TreeNode<string>*& current) { 
    // The same code 
} 

А вот немного фона чтения: Pointer to Pointer and Reference to Pointer