为了遍历通用树,我为下面链接中提到的代码编写了以下显示函数。问题是每个级别打印两次。有人能告诉我为什么吗。如果有人需要整个实现,可以在下面的链接中找到没有此函数的原始代码。其他人只需查看下面的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)
{
...
}
这样,您就不会在最初的额外时间内处理根节点。
这是一个相当简单的问题,我注意到当我表示一棵树时,无论我用哪种方式(后排序,按顺序,前排序)树叶总是以相同的顺序出现,从左到右。 我只是想知道为什么,这是有原因的吗? 我刚开始研究它们,就想到了这个。 编辑: 我有一棵这样的树: 叶节点为:D、E和F 预购顺序为:A、B、D、C、E、F 顺序是:D,B,A,E,C,F 后序是:D,B,E,F,C,A 叶子节点总是从左到右出现,不管我选择哪个顺序,问
我想对二叉树执行级别顺序遍历。因此,对于给定的树,说: 产出将是: 我知道我可以使用某种队列,但在C中递归地实现这一点的算法是什么?感谢您的帮助。
我尝试按如下方式执行二叉树的垂直顺序遍历:1)找出每个节点与根节点之间的最小和最大水平距离2)创建一个hashmap,将水平距离映射到相应的节点(Map) 然而,我得到了不想要的输出,我认为在实现中有一些错误,因为算法对我来说似乎是正确的。 以下是完整的代码: 输出:{-1=[99999],0=[99999,12],-2=[99999],1=[99999],2=[99999]}那么我的apProc
我正在研究爪哇的树木,在我正在研究的书中偶然发现了一些令人困惑的台词。给出的顺序遍历图如下: 遍历(递归)的代码是: 我感到困惑的是: 我已经突出了我所困住的部分。首先,我认为在第三步中,inOrder(C)[而不是inOrder(B)]返回inOrder(A)。第二,访问节点的顺序应该是B->A->C。 请帮帮我吧!
通常为二叉树定义顺序。让我们假设顺序对于(普通)树是“扩展”的。如果树是单个节点,则该节点是树的顺序遍历。如果树T是具有T1,T2,…,的树。。。,Tk子树和r作为根,然后按T1的顺序,然后按r的顺序,然后按T2,T3,…,的顺序遍历。。,Tk是T的顺序遍历。 T以左子右同级表示形式给出。C中节点的数据结构为: 树用指向根的指针表示。根不能有正确的同级<问题是要找到一种算法来按顺序遍历树。不允许递
二叉树之字形层次顺序遍历 给定一棵二叉树,返回其节点值的之字形层次顺序遍历。(即从左到右,然后从右到左进入下一个级别,并在这两个级别之间交替)。 例如:给定二叉树{3,9,20,#,#,15,7}, 返回其之字形级顺序遍历为: