1

今、私のループは

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

私のデータは次のようなものです

a
    a1
    a2
b
    b1

幅のみを列挙したい(a1、a2などではなく、a、bなど)。どうすればいいですか?

4

3 に答える 3

4

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

最初にルートをキューにプッシュします。次に、キューに何かがある間:

  • キューの先頭から最初のアイテムをポップします。
  • その子をキューの最後にプッシュします。
  • ポップしたアイテムを処理します。
于 2009-03-08T23:53:38.620 に答える
0

試す

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

null の親を確認して使用する必要がある場合があります

TreeNodeCollection nodes;
if(e.Node.Parent != null)
{
    nodes = e.Node.Parent.Nodes;
}
else
{
    nodes = e.Node.TreeView.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>();
}
于 2009-03-08T23:55:09.927 に答える