1

现在我的循环是

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

我的数据类似于

a
    a1
    a2
b
    b1

我只想枚举宽度(a、b 等,而不是 a1、a2 等)。我该怎么做呢?

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 回答
0

修改 bstoney 提供的代码 1. 将根节点推送到 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>();
        }
于 2017-06-07T09:31:09.030 回答