当前位置: 首页 > 知识库问答 >
问题:

树的水平顺序遍历

牛越
2023-03-14

为了遍历通用树,我为下面链接中提到的代码编写了以下显示函数。问题是每个级别打印两次。有人能告诉我为什么吗。如果有人需要整个实现,可以在下面的链接中找到没有此函数的原始代码。其他人只需查看下面的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

共有1个答案

轩辕佑运
2023-03-14

问题是,您需要处理两次根节点:您首先将其添加到队列中(在行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}, 返回其之字形级顺序遍历为: