【问题标题】:Level Order Traversal of a tree树的级别顺序遍历
【发布时间】:2012-10-09 20:49:39
【问题描述】:

为了对通用树进行级别顺序(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 30 200 300 20 30
200
300

【问题讨论】:

    标签: java algorithm generics tree tree-traversal


    【解决方案1】:

    问题是你处理你的根节点两次:你最初将它添加到你的队列中(在q.add(n) 行中),然后你处理它你首先到达n = q.poll() ,然后将其从队列中取出并再次处理。

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

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

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

    到这里:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多