Domanda

In questo momento il mio ciclo è

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

e i miei dati sono simili a

a
    a1
    a2
b
    b1

Voglio enumerare solo l'ampiezza (a, b etc, non a1, a2 ecc.). Come posso farlo?

È stato utile?

Soluzione

La prima enumerazione dell'ampiezza viene in genere eseguita utilizzando una coda di qualche tipo come struttura di dati ausiliari.

Per prima cosa spingere il root sulla coda. Quindi, mentre c'è qualcosa nella coda:

  • Pop il primo elemento dalla parte anteriore di la fila.
  • Spingi i suoi figli alla fine della coda.
  • Elabora l'elemento che hai spuntato.

Altri suggerimenti

Prova

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

potrebbe essere necessario verificare la presenza di un genitore null e utilizzare

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

Questo dovrebbe riguardare l'algoritmo breadth first (scusate se non l'ho provato)

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>();
}

Modifica il codice fornito da bstoney 1. spingere il nodo radice nella coda currentLevel 2. contrassegnare 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>();
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top