级别顺序遍历树

时间:2012-10-09 20:49:40

标签: java algorithm generics tree tree-traversal

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

Level Order traversal of a generic tree(n-ary tree) in java

谢谢!

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     三十     200     300     20     30个
    200个
    300

1 个答案:

答案 0 :(得分:4)

问题在于您处理根节点两次:您最初将其添加到队列中(在行q.add(n)中),然后在首先到达{之前处理它 {1}},然后将其从队列中取出并再次处理。

其他一切都是正确的,这就是为什么你只得到每个非根节点的两个副本:加倍只发生一次,在root。

要解决此问题,请删除行n = q.poll()(因为无论如何都要处理根节点,即使没有它),或者更改它:

q.add(n)

到此:

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

这样您就不会处理初始额外时间的根节点。