TreeNode Ширина первого перечисления? - PullRequest
1 голос
/ 09 марта 2009

Прямо сейчас мой цикл

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

и мои данные что-то вроде

a
    a1
    a2
b
    b1

Я хочу перечислить только ширину (a, b и т. Д., А не a1, a2 и т. Д.). Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 09 марта 2009

Первое перечисление в ширину обычно выполняется с использованием некоторой очереди в качестве структуры вспомогательных данных.

Сначала вставьте корень в очередь. Тогда пока есть что-то в очереди:

  • Поп первый предмет с передней очередь.
  • Вставьте его потомков в конец очереди.
  • Обработайте предмет, который вы нашли.
0 голосов
/ 07 июня 2017

Изменить код, предоставленный bstoney 1. толкнуть корневой узел в очередь currentLevel 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>();
        }
0 голосов
/ 09 марта 2009

Попробуйте

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

вам может потребоваться проверить нулевого родителя и использовать

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