现在我的循环是
for (TreeNode n = e.Node.FirstNode; n != null; n = n.NextNode)
我的数据类似于
a
a1
a2
b
b1
我只想枚举宽度(a、b 等,而不是 a1、a2 等)。我该怎么做呢?
现在我的循环是
for (TreeNode n = e.Node.FirstNode; n != null; n = n.NextNode)
我的数据类似于
a
a1
a2
b
b1
我只想枚举宽度(a、b 等,而不是 a1、a2 等)。我该怎么做呢?
广度优先枚举通常通过使用某种队列作为辅助数据结构来完成。
首先将根推入队列。然后,虽然队列中有一些东西:
尝试
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>();
}
修改 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>();
}