TreeNode 广度优先枚举?

发布于 2024-07-14 15:21:42 字数 213 浏览 5 评论 0原文

现在我的循环是

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

,我的数据就像

a
    a1
    a2
b
    b1

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

Right now my loop is

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

and my data is something like

a
    a1
    a2
b
    b1

I want to enum breadth only (a, b etc, not a1, a2 etc). How do i do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦罢 2024-07-21 15:21:42

广度优先枚举通常是通过使用某种队列作为辅助数据结构来完成的。

首先将根推入队列。
然后,当队列中有东西时:

  • 从前面弹出第一个项目
    队列。
  • 将其子级推到队列末尾。
  • 处理您弹出的项目。

Breadth first enumeration is typically done by using a queue of some sort as an ancillary data structure.

First push the root onto the queue.
Then, while there is something in the queue:

  • Pop the first item from the front of
    the queue.
  • Push its children onto the end of the queue.
  • Process the item you popped.
老旧海报 2024-07-21 15:21:42

尝试

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

Try

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

you might have to check for a null parent and use

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

This should cover the breadth first algorithm (sorry I haven't tested it)

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>();
}
七婞 2024-07-21 15:21:42

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

Modify code provided by bstoney
1. push root node to currentLevel queue
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>();
        }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文