Új hozzászólás Aktív témák

  • Azazel999

    csendes tag

    Sziasztok!

    C++-ban szeretnék készíteni egy önszervező bináris keresőfát (vagy Java-ban, de azzal elakadtam, mert pointerek nélkül nehézkes a dolog, szóval inkább C++). A vágás (vagyis a legfontosabb metódus :P) még nincs meg, de azon kívül minden más igen (keresés, beszúrás, törlés, minimális/maximális elem, előző/ következő elem, teljes fa és egyetlen elem kiíratása). A problémám az, hogy bár a kód "szépen" néz ki és működnie is kéne, összeomlik, amikor keresek egy elemet. Már pedig ez nagyon nagy baj, mert a többi metódus szinte mind elemekre (részfa-gyökerekre) mutató pointereket kér paraméternek. Ebből adódóan egyik sem fut, mert nem tudok nekik pointert adni. Van egy Fa osztályom és egy Main állományom, ezek lennének:

    Fa.cpp
    #include "Fa.hpp"
    #include <iostream>
    #include <cstddef>

    using namespace std;

    Fa::Fa(){
    this->kulcs = -1;
    this->bal = NULL;
    this->jobb = NULL;
    this->apa = NULL;
    }

    Fa::Fa(int kulcs, Fa* bal, Fa* jobb, Fa* apa){
    this->kulcs = kulcs;
    this->bal = bal;
    this->jobb = jobb;
    this->apa = apa;
    }

    Fa::~Fa(){}

    Fa::Fa(Fa& other){
    this->kulcs = other.kulcs;
    this->bal = other.bal;
    this->jobb = other.jobb;
    this->apa = other.apa;
    }

    Fa* Fa::keres(int kulcs){
    if (this->kulcs == kulcs){
    return this;
    } else if (this->kulcs < kulcs){
    return this->bal->keres(kulcs);
    } else {
    return this->jobb->keres(kulcs);
    }
    }

    Fa* Fa::min(){
    if (this->bal == NULL){
    return this;
    } else {
    return this->bal->min();
    }
    }

    Fa* Fa::max(){
    if (this->jobb == NULL){
    return this;
    } else {
    return this->jobb->max();
    }
    }

    Fa* Fa::kovetkezo(){
    if (this->jobb != NULL){
    return this->jobb->min();
    } else {
    Fa* q = this->apa;
    Fa* p = this;
    while (q != NULL && p == q->jobb){
    p = q;
    q = p->apa;
    }
    return q;
    }
    }

    Fa* Fa::elozo(){
    if (this->bal != NULL){
    return this->bal->max();
    } else {
    Fa* p = this->apa;
    Fa* q = this;
    while (q != NULL && p == q->bal){
    p = q;
    q = p->apa;
    }
    return q;
    }
    }

    void Fa::beszur(/*Fa* fa, */Fa* beszurando){
    Fa* y = NULL;
    Fa* x = this;
    while (x != NULL){
    y = x;
    if (beszurando->kulcs < y->kulcs){
    x = x->bal;
    } else {
    x = x->jobb;
    }
    }
    beszurando->apa = y;
    if (y == NULL){
    //fa = beszurando; //Ures volt a fa
    } else {
    if (beszurando->kulcs < y->kulcs){
    y->bal = beszurando;
    } else {
    y->jobb = beszurando;
    }
    }
    }

    void Fa::torol(Fa* fa, Fa* torlendo){
    Fa *x, *y;
    if (torlendo->bal == NULL || torlendo->jobb == NULL){
    y = torlendo;
    } else {
    y= torlendo->kovetkezo();
    }
    if (y->bal != NULL){
    x = y->bal;
    } else {
    x = y->jobb;
    }
    if (x != NULL){
    x->apa = y->apa;
    }
    if (y->apa = NULL){
    fa = x;
    } else if (y == y->apa->bal) {
    y->apa->bal = x;
    } else {
    y->apa->jobb = x;
    }
    if (y != torlendo){
    torlendo->kulcs = y->kulcs;
    }
    }

    void Fa::kiir(){
    cout << "kulcs: " << this->kulcs;
    if (this->bal != NULL){
    cout << " bal: " << this->bal->kulcs;
    } else {
    cout << " bal: NULL";
    }
    if (this->jobb != NULL){
    cout << " jobb: " << this->jobb->kulcs;
    } else {
    cout << " jobb: NULL";
    }
    if (this->apa != NULL){
    cout << " apa: " << this->apa->kulcs << endl;
    } else {
    cout << " apa: NULL" << endl;
    }
    if (this->bal != NULL){
    this->bal->kiir();
    }
    if (this->jobb != NULL){
    this->jobb->kiir();
    }
    }

    void Fa::kiir_egyet(){
    cout << "kulcs: " << this->kulcs;
    if (this->bal != NULL){
    cout << " bal: " << this->bal->kulcs;
    } else {
    cout << " bal: NULL";
    }
    if (this->jobb != NULL){
    cout << " jobb: " << this->jobb->kulcs;
    } else {
    cout << " jobb: NULL";
    }
    if (this->apa != NULL){
    cout << " apa: " << this->apa->kulcs << endl;
    } else {
    cout << " apa: NULL" << endl;
    }
    }

    Main.cpp
    #include <iostream>
    #include <cstddef>
    #include <cstring>
    #include "Fa.hpp"

    using namespace std;



    int main (int argc, char** argv){
    //fa letrehozasa
    Fa *fa = new Fa(5, NULL, NULL, NULL);
    fa->beszur(new Fa(3, NULL, NULL, NULL));
    fa->beszur(new Fa(4, NULL, NULL, NULL));
    fa->beszur(new Fa(15, NULL, NULL, NULL));
    fa->beszur(new Fa(2, NULL, NULL, NULL));
    fa->beszur(new Fa(7, NULL, NULL, NULL));
    cout << endl;
    fa->kiir();
    cout << "\n" << endl;
    //cout << fa->keres(15)->kiir_egyet();

    }

    Tudnátok adni valami tippet, hogy mi lehet a baj?

Új hozzászólás Aktív témák