2016-05-18 18 views
0

Also habe ich eine Baumknoten-Klasse getestet und habe einige Fehler festgestellt. Ich denke, das liegt daran, dass ich private Node-Mitglieder verwende und Accessor-Funktionen nutze, um auf sie zuzugreifen. Mit der Del-Funktion habe ich versucht, den Testbaum beim Traversieren in PostOrder zu drucken und zu löschen, aber es gibt keine Ausgabe außer dem "root".Fehler mit Knoten der Baumklasse, vielleicht wegen der privaten Knotenmitglieder

#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 

Und

#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); 
} 

Antwort

0

Dann versuchen Sie einen linken oder rechten Kindknoten Ihre recInsert Funktion erhält einen Zeiger auf einen Knoten anstelle eines Zeigers auf einen Zeiger oder eine Referenz auf einen Zeiger hinzuzufügen. Sie ändern also den Funktionsparameter anstelle eines untergeordneten Knotens. Hier ist eine schnelle Lösung:

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

Und hier ist ein wenig Hintergrund Lesung: Pointer to Pointer and Reference to Pointer