2009-03-08 7 views
1

En ce moment, ma boucle estTreeNode Largeur première enum?

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

et mes données sont quelque chose comme

a 
    a1 
    a2 
b 
    b1 

Je veux enum largeur que (a, b, etc., non a1, a2, etc.). Comment puis-je faire cela?

Répondre

4

La première énumération est généralement effectuée en utilisant une file d'attente de quelque sorte comme structure de données auxiliaire.

Poussez d'abord la racine dans la file d'attente. Ensuite, alors qu'il ya quelque chose dans la file d'attente:

  • Pop le premier élément de l'avant de la file d'attente .
  • Poussez ses enfants au bout de la file d'attente.
  • Traite l'objet que vous avez sauté.
0

Essayez

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

vous pourriez avoir à vérifier pour un parent nul et utiliser

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

Cela devrait couvrir l'ampleur premier algorithme (désolé, je ne l'ai pas testé)

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

Modifier le code fourni par bstoney 1. pu sh root node to currentLevel file d'attente 2. marquez 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>(); 
     }