2009-03-08 5 views
1

Gerade jetzt meine Schleife istTreeNode Breite erste Enum?

for (TreeNode n = e.Node.FirstNode; n != null; n = n.NextNode) 

und meine Daten ist so etwas wie

a 
    a1 
    a2 
b 
    b1 

Ich möchte nur Breite ENUM (a, b usw., nicht a1, a2 usw.). Wie mache ich das?

Antwort

4

Die erste Aufzählung in der Breite erfolgt normalerweise, indem eine Warteschlange als zusätzliche Datenstruktur verwendet wird.

Zuerst schieben Sie die Wurzel in die Warteschlange. Dann, während es etwas in der Warteschlange ist:

  • Pop das erste Element von der Vorderseite des der Warteschlange.
  • Schieben Sie ihre Kinder auf das Ende der Warteschlange.
  • Verarbeiten Sie den Artikel, den Sie geöffnet haben.
0

Versuchen

foreach (TreeNode n in e.Node.Parent.Nodes) 

Sie könnten für eine Null-Eltern überprüfen und

TreeNodeCollection nodes; 
if(e.Node.Parent != null) 
{ 
    nodes = e.Node.Parent.Nodes; 
} 
else 
{ 
    nodes = e.Node.TreeView.Nodes; 
} 

Diese verwenden sollte die Breite ersten Algorithmus decken (sorry ich habe es nicht getestet)

Queue<TreeNode> currentLevel = new Queue<TreeNode>(nodes); 
Queue<TreeNode> nextLevel = new Queue<TreeNode>(); 

while(currentLevel.Count > 0) 
{ 
    while(currentLevel.Count > 0) 
    { 
     TreeNode n = currentLevel.Dequeue(); 

     // Add child items to next level 
     foreach(TreeNode child in n.Nodes) 
     { 
      nextLevel.Enqueue(child); 
     } 
    } 
    // Switch to next level 
    currentLevel = nextLevel; 
    nextLevel = new Queue<TreeNode>(); 
} 
0

Modify-Code von bstoney zur Verfügung gestellt 1. pu sh Wurzelknoten zu currentLevel Queue 2. Mark nextLevel = new Queue();

 Queue<TreeNode> currentLevel = new Queue<TreeNode>(); 
     Queue<TreeNode> nextLevel = new Queue<TreeNode>(); 
     // 1. push root to the queue 
     currentLevel.Enqueue(treeView1.Nodes[0]); 

     // pop the first item from the front of the queue 
     while (currentLevel.Count > 0) 
     { 
      while (currentLevel.Count > 0) 
      { 
       TreeNode n = currentLevel.Dequeue(); 
       Console.WriteLine(n.Text); 

       // Add child items to next level 
       foreach (TreeNode child in n.Nodes) 
       { 
        nextLevel.Enqueue(child); 
       } 

      } 
      // Switch to next level 
      currentLevel = nextLevel; 
      // 2. mark this line 
      //nextLevel = new Queue<TreeNode>(); 
     }