Eine Suche im BinaerBaum



  • ein frohes neues an alle 😉

    kaum hat das jahr begonnen sitz ich wieder über einem problem 😉

    mein ziel: (wenn es der titel noch nicht verraten hat 😉 )
    ich möchte einen wert in einem binärbaum suchen..
    mein problem: er gibt mir komische werte wieder zurück, die ich nicht nachvollziehen kann

    Die MAIN

    #include "bintree.h"
    #include "bintree.cpp"
    #include <iostream>
    
    int main()
    {
      Baum<int> binaryTree;
      binaryTree.einfuegen(5);
      binaryTree.einfuegen(3);
      binaryTree.einfuegen(2);
      binaryTree.einfuegen(6);
      binaryTree.einfuegen(12);
      binaryTree.einfuegen(9);
      binaryTree.einfuegen(10);
      binaryTree.einfuegen(1);
    
      std::cout << binaryTree.pruefen(4) << "\n";
      std::cout << binaryTree.pruefen(6) << "\n";
    
    return 0;
    }
    

    der QUELLTEXT

    /**Suche im Binaerbaum*/
    template<class T>
    int Baum<T>::SuchenImBinaerbaum(knoten<T>* &p, T t)
    {
      if(p!=NULL) {
      if(p->inhalt == t) return p->inhalt;
      if(t > p->inhalt) SuchenImBinaerbaum(p->rechts, t);
      if(t < p->inhalt) SuchenImBinaerbaum(p->links, t);
    }
    else return 0;
    }
    
    /**Baum Methode pruefen*/
    template<class T>
    int Baum<T>::pruefen(T t)
    {
      return SuchenImBinaerbaum(root, t);
    }
    

    DIE AUSGABE

    g++    -c -o bintree.o bintree.cpp
    c++ -c bintree_main.cpp  -I./UnitTest++/src -I.
    c++ bintree.o bintree_main.o -L./UnitTest++ -lUnitTest++ -o bintree_main
    -4
    134516320
    

    ich hoffe es kann mir einer erklären, wieso die ausgabe so eigenartig ist
    vielen dank schon einmal
    grüße kylanysik



  • Geh da am besten mit dem Debugger durch. Dann siehst du, wo die Werte zurückgegeben werden und schon hast du den (Denk)fehler.



  • [cpp]
    /**Suche im Binaerbaum*/
    template<class T>
    int Baum<T>::SuchenImBinaerbaum(knoten<T>* &p, T t)
    {
    if(p!=NULL) {
    if(p->inhalt == t) return p->inhalt;
    if(t > p->inhalt) return SuchenImBinaerbaum(p->rechts, t);
    if(t < p->inhalt) return SuchenImBinaerbaum(p->links, t);
    }
    else return 0;
    }
    [/cpp]



  • Eine saubere Einrückung wäre wahrscheinlich auch nicht das Schlechteste... 😉



  • vielen vielen dank für die antworten

    @ volkard
    ich danke dir. jetzt funzt alles 🙂

    @ nexus
    ich werds versuchen leserlicher zu gestalten 🙂

    grüße kylanysik



  • und sehr gut ist es, immer den fall, den man festgestellt hat, sofort abzuhandeln.
    damit meine ich, das fürchterlich lange verschieben des return 0.

    /**Suche im Binaerbaum*/ 
    template<class T> 
    int Baum<T>::SuchenImBinaerbaum(knoten<T>* &p, T t) 
    { 
      if(p==NULL) 
        return 0;
      if(p->inhalt == t) 
        return p->inhalt; 
      if(t > p->inhalt)
        return SuchenImBinaerbaum(p->rechts, t); 
      if(t < p->inhalt) 
        return SuchenImBinaerbaum(p->links, t); 
    }
    


  • Üblicherweise arbeitet man bei so etwas mit Referenzen (auch, wenn das bei PODs meist langsamer ist -> const T &t ) - und der Rückgabewert erscheint mir auch zumindest fragwürdig ^^ (sollte wahrscheinlich eher const &T oder &T oder T sein). Da man aber den Knoten eh schon durch die Referenz auf den Pointer bekommst, könntest du auch nur nen bool nehmen (gefunden/nicht gefunden - oder ihn ganz weglassen und Notfalls ne Exception werfen - gibt genug Möglichkeiten - aber die ist sicherlich nicht (vollkommen) richtig)

    bb


Anmelden zum Antworten