2017-06-07 2 views
0

Gibt es eine einfache Möglichkeit zu überprüfen, den Status von TreeNode und seinen Kindern zu erweitern?Wie überprüft man, ob alle Unterknoten von TreeNode erweitert sind?

bool IsAllNodesExpanded(TreeNode nodeToCheck) 
{ 
    // Use nodeToCheck.isExpanded 
    // Use something to check all childrens 
    // return something 
} 
+0

Nur ein Tipp, wenn Sie mit C# arbeiten, verwenden Sie Pascal Fall für Methoden. Zum Beispiel: 'IsAllNodesExpanded' – BendEg

Antwort

1

Da Ihre Frage zu einer bestimmten WinForm Komponente spezifisch ist, aber die Lösung, ich werde Sie schreiben, ist allgemeiner. Deshalb werde ich Ihnen meine Lösung erklären, wenn Sie einen allgemeinen Baum betrachten, aber der Code, den ich Ihnen zur Verfügung stelle, löst Ihr eigenes Problem.

Was Sie tun möchten, ist im Grunde eine tree traversal, die der Prozess der Durchquerung aller Kinder eines Baumes ist, da seine Wurzel ist. Grundsätzlich müssen wir überprüfen, ob alle die Nachkommen (nicht die Kinder) eines Knotens sind. Der Unterschied zwischen Kindern und Nachkommen besteht darin, dass Kinder denselben Elternteil haben (zum Beispiel sind ABC Kinder von X, wenn AB und C direkt mit X verbunden sind), während Nachkommen "Kinder von Kindern von Kindern ... von Kindern" sein können (Beispiel: A ist ein Nachkomme von X, wenn von X ausgehend, ein Pfad auf dem Baum, die von dem Knoten X ausgehend, geht unten zum Knoten A)

um zu besuchen. Für alle Nachkommen eines Baumes benötigen wir eine rekursive Funktion, in unserem Fall gibt die Funktion einen booleschen Wert zurück, der uns sagt, ob alle Nachkommen eines bestimmten Startknotens expandiert sind Es gibt einen Beispielcode, der genau das tut, wonach Sie gefragt haben :

bool areAllNodesExpanded(TreeNode nodeToCheck){ 

    if(!nodeToCheck.IsExpanded) 
     return false; 
    foreach(TreeNode n in nodeToCheck.Nodes){ 
     if (n.Nodes.Count == 0) 
      continue; 
     if(!areAllNodesExpanded(n)) 
      return false; 
    } 
    return true; 
} 

Hoffe das hilft.

LuxGiammi

EDIT: der Code-Snippet oben nicht wegen zwei Fehler kompiliert wird, kann ich gemacht: 1. es ist IsExpanded und nicht 2. Aus irgendwelchen Gründen IsExpanded ich will nicht weiter untersuchen, var n ist vom Typ Objekt, während es vom Typ TreeNode sein sollte. Fehler korrigiert

+0

Dieses Code-Snippet kompiliert nicht ... – user3292642

+0

Sie haben Recht ... Ich habe einen uppecase Charakter vermisst, als ich schrieb ... Das Wichtigste ist, dass die * Erklärung * von dem, was ich mache, klar ist und dass Sie Kopieren Sie den Code nicht, wie er ist. Das ist eine sehr gefährliche Sache! – LuxGiammi

+0

Nach foreach sollte 'if (n.Nodes.Count> 0)' sonst am letzten Knoten wird es erkennen, dass es nicht erweitert ist, weil es keine Kinder hat und es nicht erweitert werden kann – MrJW

-1

Statt TreeNode verwenden Sie können Ihre eigene Klasse einführen, die von TreeNode ableitet. Diese Klasse könnte eine rekursive Methode IsAllNodesExpanded wie diese: (ungetestet)

public class MyTreeNode : TreeNode 
{ 
    public bool IsAllNodesExpanded() 
    { 
    if (!IsExpanded) 
    { 
     return false; 
    } 

    bool allChildsExpanded = true; 

    foreach (MyTreeNode child in Nodes.OfType<MyTreeNode>()) 
    { 
     if (!child.IsAllNodesExpanded()) 
     { 
     allChildsExpanded = false; 
     break; 
     } 
    } 

    return allChildsExpanded; 
    } 
} 
+0

Lust auf einen Kommentar? – user3292642

Verwandte Themen