为了对通用树进行级别顺序(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
答案 0 :(得分:4)
问题在于您处理根节点两次:您最初将其添加到队列中(在行q.add(n)
中),然后在首先到达{之前处理它 {1}},然后将其从队列中取出并再次处理。
其他一切都是正确的,这就是为什么你只得到每个非根节点的两个副本:加倍只发生一次,在root。
要解决此问题,请删除行n = q.poll()
(因为无论如何都要处理根节点,即使没有它),或者更改它:
q.add(n)
到此:
while(n!=null)
{
...
n = q.poll();
}
这样您就不会处理初始额外时间的根节点。