Du erstellst einen sogenannten Iterator. Das ist ein Objekt, das zu einem Zeitpunkt immer genau
1. ... ein Element der rekursiven Struktur definiert
2. ... weiss, wo's als nächsts langgeht.
Zählen würde ich nicht, sondern eher mit einem 'First/Next/EndOfData()' Schema arbeiten.
Im Prinzip ist ein Iterator eine Liste von Ebenenpositionen: Pro Ebene ein Element und jedes Element hat die Aussage: "In dieser Ebene (des Baumes) bin ich gerade an dieser Position".
Eine Position ist definiert durch den Knoten sowie den aktuell besuchten Subknoten. Die unterste Position in dieser Liste zeigt naturgemäß auf ein Blatt.
Zunächst verweisen alle Positionen auf den ersten Unterknoten, das letzte Element somit auf das Blatt ganz links (First). Ein Aufruf von 'Next' geht nun zum nächsten Blatt, bis keins mehr da ist. Dann geht's eine Ebene nach oben, dort zum nächsten Unterknoten und dieser liefert wieder das erste Blatt. usw.
Irgendwann ist der Iterator überall an der letzten Position und kann einfach nicht weiter, dann liefern 'EndOfData' den Wert True.
Somit kann man so eine Struktur einfach so durchlaufen:
Code:
TreeIterator treeIterator = new TreeIterator(MyTree);
treeIterator.First();
while (!treeIterator.EndOfData) {
DoSomethingWith (treeIterator.CurrentItem());
treeIterator.Next();
}