Triple Tree in c++



  • #include <iostream>
    using namespace std;
    
    class Bst
    {
    	public:
    
    	struct Node
    	{
    		Node *left;
    		Node *right;
    		Node *middle;
    		char info;
    	};
    
    	Bst()
    	{
    		root = NULL;
    	}
    
    	Node rec_insert(char a, Node* tree)
    	{
    		if(tree == NULL)
    		{
    			tree = new Node;
    			tree->left = NULL;
    			tree->info = a;
    			tree->right = NULL;
    			tree->middle = NULL;
    		}
    
    		else
    		{
    			if(a < tree->info)
    				*tree->left = rec_insert(a, tree->left);
    			else if (a > tree->info)
    				*tree->right = rec_insert(a, tree->right);
    			else 
    				*tree->middle = rec_insert(a, tree->middle); 
    		}
    		return *tree;
    	}
    
    	void insert(char ding)
    	{
    		*root = rec_insert(ding,root);
    	}
    
    	void traverse()
    	{
    		rtraverse(root);
    	}
    
    	void rtraverse(Node *tree)
    	{
    		if(tree != NULL)
    		{
    			visit(tree->info);
    			rtraverse(tree->left);
    			visit(tree->info);
    			rtraverse(tree->right);
    		}
    
    	}
    
    	void visit(char buchstabe)
    	{
    		cout << buchstabe;
    	}
    
    	private:
    
    	Node *root;
    
    };
    
    void main()
    {
    	Bst test;
    
    	test.insert('a');
    	test.insert('b');
    	test.insert('c');
    
    	test.traverse();
    }
    

    Warum gibt diese Programm nichts aus? es sollte doch eigentlich abc ausgeben.
    Es ist ein Baum mit max. 3 Nachfolgern, eine rekursive Struktur also.
    Wo kann der Fehler liegen??

    Ich hoffe auf Hilfe!
    Vielen Dank



  • Der Parameter "Node* tree" in der rec_insert() ist eine Kopie des übergebenen Zeigers, also haben die Änderungen am Zeiger keine Auswirkungen auf die übergeordnete Funktion (eventuelle Änderungen an den Daten dahinter haben dagegen schon Auswirkungen, aber so weit kommt es gar nicht erst). Die Lösung nennt sich 'Referenz' und sieht so aus: Node rec_insert(char a,Node*& tree);

    Übrigens hast du einen inhaltlichen Fehler in der Ausgabe-Methode - du gibst zweimal den Schlüsselwert im aktuellen Knoten aus, aber dafür unterschlägst du den mittleren Nachfolger.


Anmelden zum Antworten