繁体   English   中英

树的层级顺序遍历

[英]Level Order Traversal of a tree

为了对通用树进行级别顺序(BFS)遍历,我为以下链接中提到的代码编写了以下显示函数。 问题是每个级别都打印两次。 有人可以告诉我为什么。 如果有人需要整个实现,则可以在下面的链接中找到没有此功能的原始代码,否则,请查看下面的displayBFS函数,并告诉我为什么值重复

Java中通用树(n元树)的层级顺序遍历

谢谢!

void displayBFS(NaryTreeNode n)
{
    Queue<NaryTreeNode> q  = new LinkedList<NaryTreeNode>();

    if(n!=null)
    {
        q.add(n);
        System.out.println(n.data);
    }

    while(n!=null)
    {
        for(NaryTreeNode x:n.nary_list)
        {
            q.add(x);
            System.out.println(x.data );
        }        
        n =  q.poll();
    }  
}

当前树形结构供参考:

     root(100)
    /      |       \
  90       50       70
  /        \
20 30   200  300

输出:100 90 50 70 90 50 70 20 30 200 300 20 30
200
300

问题是您对根节点进行了两次处理:首先将其添加到队列中(在q.add(n) ),然后首先到达n = q.poll()进行处理。您可以将其从队列中取出并再次处理。

其他所有内容都是正确的,这就是为什么每个非根节点仅获得两个副本的原因:倍增在根仅发生一次。

要解决此问题,请删除q.add(n) (因为无论如何,即使没有根节点,您都必须对其进行处理),否则请更改此行:

    while(n!=null)
    {
        ...
        n =  q.poll();
    }

对此:

    while((n = q.poll()) != null)
    {
        ...
    }

这样就不会在最初的额外时间里处理根节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM