Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe bei BBaum

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.09.2006, 12:21 Uhr
cmos



Hallo,
ich brauch Hilfe bei einem Binärbaum.
Bisher habe ich folgenden Code.

Node.h

C++:
#ifndef Node_h
#define Node_h Node_h

class CNode
{
    private:
        CNode** pChildren;
        char value;
        int key;
    public:
        CNode(int key, char value);
        ~CNode(void);

        //set
        void SetChild(int index, CNode* pChild);
        void SetKey(int key);
        void SetValue(char value);
        void add(int key, char value);

        //get
        int GetKey();
        CNode* GetChild(int index);

};

#endif



Node.cpp

C++:
#include "StdAfx.h"
#include ".\node.h"
#include <stdlib.h>
CNode::CNode(int key, char value)
{
    pChildren = new CNode*[2];
    for(int i = 0; i < 2; i++)
    {    
        pChildren[i] = NULL;
    }
    this->value = value;
    this->key = key;
}

CNode::~CNode(void)
{
}

//set
void CNode::SetChild(int index, CNode* pChild)
{
    this->pChildren[index] = pChild;
}

void CNode::SetKey(int key)
{
    this->key = key;
}

void CNode::SetValue(char value)
{
    this->value = value;
}

void CNode::add(int key, char value)
{
    if(key < this->key)
    {
    
    }
    else if(key > this->key)
    {
    
    }
}

//get
CNode* CNode::GetChild(int index)
{
    return this->pChildren[index];
}

int CNode::GetKey()
{
    return this->key;
}



Tree.h

C++:
#ifndef Tree_h
#define Tree_h Tree_h
#include "Node.h"

class CTree
{
    private:
        CNode* pRoot;
        
    public:
        CTree(void);
        ~CTree(void);

        void Add(int key, char value);
};

#endif



Tree.cpp

C++:
#include "StdAfx.h"
#include ".\tree.h"
#include <stdlib.h>

CTree::CTree(void)
{
    pRoot = NULL;
}

CTree::~CTree(void)
{
}

void CTree::Add(int key, char value)
{
    if(pRoot == NULL)
    {
        this->pRoot = new CNode(key, value);
        return true;
    }
    else
    {
        
    }
}



Ich habe noch ein paar Verständnisprobleme.
Wenn pRoot NULL ist, dann existiert kein Baum, also muss ich einen anlegen.
Wenn eine Wurzel bereits existiert, was dann ?
Kann ich dann schreiben

C++:
this->pRoot->add(key, value);   //???


Dies würde dann unter Node die Methode add aufrufen.
In der Add MEthode muss ich überprüfen ob der neue Schlüssel größer als schon ein vorhandener ist, richtig ? Denn die kleineren Werte stehen immer auf der linken Seite und die größeren verlaufen auf der rechten. Wenn ich die Keys mit den shcon vorhandenen
überprüft habe, müsste ich doch eigentlich noch wissen ob bereits einträge darin vorliegen ?

Geht das so

C++:
if(key < this->key)
{
    this->pChildren[0]->add(key, value)
}
else if(key > this->key)
{
        this->pChildren[1]->add(key, value)
}




für mich hat es den Anschein, als sei das Rekursiv.
Wenn der Key bsp.weise kleiner ist dann setzt er den key und wert
an pChildren[0], wenn nicht an die [1].

Aber irgendwas fehlt bestimmt noch und ich habe ein PRoblem das komplett nachzuvollziehen.

Danke,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.09.2006, 12:29 Uhr
Blubber2063



Was verstehst du daran nicht du hast es doch gut erklärt, es fehlt zwar noch die Sicherheitsabfrage das der letzte Knoten Null ist damit man dort dann das neue Element einfügt, aber sonst ist das schon so ziemlich alles was du für nen unbalancierten Binären Baum brauchst. Für nen BBaum musst du natürlich umständlicher vorgehen und über alle Elemente eines Knoten schauen wo du zwischen passt, wenn da kein Platz mehr im Knoten ist. Von einem BBaum würde ich dir aber abraten, denn ein BBaum ist ein balancierter T-Ärer Baum und das ist alles andere als lustig den zu schreiben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.09.2006, 12:36 Uhr
Bruder Leif
dances with systems
(Operator)


Um Verständnisproblemen vorzubeugen: "Binärbaum" != "B-Baum" != "B*-Baum"
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.09.2006, 12:51 Uhr
cmos



Hallo,
ich meinte mit BBaum eigentlich einen Binärbaum. Wusste nicht
das es da noch einen BBaum gibt.
1. Was meinst du mit sicherheitsabfrage?
2. Ist die Add Methode rekursiv ?
Wenn ja, dann bräuchte ich doch einen Rekursionsanker.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.09.2006, 13:11 Uhr
Blubber2063



Sie ist rekursiv, ja du brauchst den Anker das meinte ich mit der Sicherheitsabfrage.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.09.2006, 14:29 Uhr
cmos



Hallo, danke für die schnelle antwort.
HIer nochmal die add Methode, von jemand anderes
aber ich verstehe sie nicht ganz.


C++:
bool Node::add(int key, char value)
{
  bool result = true;

    if (key < this->key)
    {
                if (this->pChildren[0] != NULL)
                {
                         result =  this->pChildren[0]->add(key, value);
                }
                else
                {
                        this->pChildren[0] = new CNode(key, value);
                }
    }
    else if (key > this->key)
    {
                if (this->pChildren[1] != NULL)
               {
                         result = this->pChildren[1]->add(key, value);
               }
               else
               {    
                        this->pChildren[1] = new CNode(key, value);
               }
    }
    else if (key == this->key)
    {
                result = false;
    }

    return result;
}


Das verstehe ich nicht ganz. Bei der Abfrage
{cpp]if (this->children[0] != NULL)[/cpp]
wird überprüft ob in [0] schon etwas steht.
Aber was bedeutet

C++:
result =  this->children[0]->add(key, value);

wo wird denn hier result ausgewrtet ?
Hat jemand bitte die Muse mir diese Zeilen Code zu erklären ?

Danke,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.09.2006, 15:08 Uhr
Blubber2063



Naja also das dürfte ein Baum sein der nicht redudant ist, also jeden Wert nur einmal beherbergt, daher der bool ob das einfügen erfolgreich war. Ansonsten bewegt man sich so lange durch den Baum bis eine freie Stelle gefunden ist und fügt dann dort ein neues Blatt ein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.09.2006, 15:32 Uhr
cmos



Hallo,
und an welcher Stelle wird abgefragt ob das Einfügen erfolgreich war oder nicht ?

Grüße,
cmos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.09.2006, 17:08 Uhr
Blubber2063



Das bleibt natürlich dem nutzer des Baums überlassen. Bzw des evtl. Containers der den Baum zur Datenhaltung nutzt. So würde ich zumindest die Entwicklungsidee des Programmierers deuten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: