2009-03-08 12 views
1

は今の私のループはTreeNode最初の列挙型の幅は?

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

で、私のデータは、私は(A2など、Bなどではなく、A1、)のみ幅を列挙したい

a 
    a1 
    a2 
b 
    b1 

のようなものです。私はこれをどのようにして行うのですか?

答えて

4

通常、最初の列挙は、補助データ構造として何らかの種類のキューを使用して行われます。

まず、ルートにキューを押します。その後 、キューの中の何かがある間:

  • キューの先頭から最初の項目をポップに。
  • 子をキューの最後にプッシュします。
  • ポップしたアイテムを処理します。
0

(申し訳ありませんが、私はそれをテストしていない)あなたがnullの親をチェックし、これが幅優先アルゴリズムをカバーしなければならない

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

を使用する必要があります

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

をお試しください

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

修正コード:bstoney 1. pu shルートノードからcurrentLevelキューへ 2.マーク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>(); 
     }