Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

1

14.05.2006, 15:43

Iterartives Traversieren von Bäumen

Weiß jemand, wie ein Algorithmus zum iterativen traversieren von (allgemeinen) Bäumen aussieht bzw. aussehen könnte?

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

14.05.2006, 16:10

Wie willst du den Baum denn durchlaufen?
Inorder, preorder, postorder ... ?

Phil_GDM

Alter Hase

  • »Phil_GDM« ist der Autor dieses Themas

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

3

14.05.2006, 16:20

Das ist mir momentan eigentlich egal, hauptsache er wird komplett durchlaufen.

Die Frage die mich beschäftigt ist, ob es für allgemeine Bäume einen vernünftigen iterativen Ansatz gibt (für binäre Bäume gibt es die ja).

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

14.05.2006, 18:22

Du könntest dir mit einem Stack merken, welche Knoten du noch nicht besucht hast und den Stack iterativ abarbeiten, bis er leer ist.

Das könnte so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void traverseTree(const Tree& tree)
{
    stack<TreeNode*> toBeVisited;
    toBeVisited.push(tree.getRoot());
    while(!toBeVisited.empty())
    {
        TreeNode* p_node = toBeVisited.top();
        toBeVisited.pop();

        // hier irgendwas mit dem Knoten p_node machen

        // ...


        // Kinderknoten hinzufügen

        list<TreeNode*>& children = p_node->getChildren();
        for(list<TreeNode*>::iterator i = children.begin(); i != children.end(); i++)
        {
            toBeVisited.push(*i);
        }
    }
}

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

14.05.2006, 21:04

Also ich mach so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool        bQuit   = FALSE;
ogEntity*   pEntity = m_pFirstEntry;
ogEntity*   pTemp   = NULL;
while(!bQuit)
{
    if(pEntity->pChild) pEntity = pEntity->pChild;
    else if(pEntity->pPrev) pEntity = pEntity->pPrev;
    else
    {
        //Gibt es einen nächsten Eintrag in dieser Ebene?

        if(pEntity->pNext)
        {
            //Ja

            pEntity->pNext->pPrev   = NULL;
            pTemp                   = pEntity->pNext;
        }
        else if(pEntity->pParent)
        {
            //Nein nur Eltern

            pEntity->pParent->pChild    = NULL;
            pTemp                       = pEntity->pParent;
        }
        else bQuit = TRUE;

        //Hier kannst du rein tun, was mit dem Datensatz passieren soll...


        pEntity = pTemp;
    }
}
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

15.05.2006, 14:50

Das setzt natürlich voraus, dass man von jedem Knoten den Nachbarn kennt.

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

7

15.05.2006, 18:02

Beim Erstellen des neuen Knotens kann man das ja ganz einfach speichern...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige