C++ 父数组n元树的逐级遍历?

C++ 父数组n元树的逐级遍历?,c++,arrays,algorithm,tree,C++,Arrays,Algorithm,Tree,给定存储在父数组中的n元树,子元素存储在指向数组的指针数组中,其中第一个值是子元素的数量: (childArray[2][0]显示节点2有2个子节点,childArray[2][1]显示其第一个子节点是5,以此类推) 生成如下所示的树: 3 /|\ 0 2 4 | |\ 1 5 6 使用队列,如何逐级输出树,如下所示: 级别1:3 第二级:0、2、4 三级:1、5、6 级别1和级别2很容易,因为级别1只是根,级别2只是它的子级,但在这之后,我不知道如何让它获取子级的子级。一种方法是使用数

给定存储在父数组中的n元树,子元素存储在指向数组的指针数组中,其中第一个值是子元素的数量:

(childArray[2][0]显示节点2有2个子节点,childArray[2][1]显示其第一个子节点是5,以此类推)

生成如下所示的树:

  3
 /|\
0 2 4
| |\
1 5 6
使用队列,如何逐级输出树,如下所示:

级别1:3

第二级:0、2、4

三级:1、5、6


级别1和级别2很容易,因为级别1只是根,级别2只是它的子级,但在这之后,我不知道如何让它获取子级的子级。

一种方法是使用数据结构

从一些队列q开始,并将其放入其父项为-1的(唯一)项的索引中。现在,在每一步,直到q为空


  • 执行v一种方法是使用数据结构

    从一些队列q开始,并将其放入其父项为-1的(唯一)项的索引中。现在,在每一步,直到q为空


    • 执行v您必须在树上执行(广度优先搜索),同时保持推入下一级别的节点数。大纲:

      q.push(root); nodesInCurrentLevel = 1; nodesInNextLevel = 0; currentLevelIndex = 1;
      while q is not empty do:
        u = q.pop()
        print currentLevelIndex and u
        decrement nodesInCurrentLevel
        for every child v of u do:
          increment nodesInNextLevel
          q.push(v)
        if nodesInCurrentLevel is 0 do:
          nodesInCurrentLevel = nodesInNextLevel
          nodesInNextLevel = 0
          increment currentLevelIndex
      

      当然,这会将输出打印为级别2:0级别2:2等。您可以将当前级别节点存储在循环中的临时列表中,并根据需要进行打印。

      您必须在树上执行(广度优先搜索),同时保持推入下一级别的节点数。大纲:

      q.push(root); nodesInCurrentLevel = 1; nodesInNextLevel = 0; currentLevelIndex = 1;
      while q is not empty do:
        u = q.pop()
        print currentLevelIndex and u
        decrement nodesInCurrentLevel
        for every child v of u do:
          increment nodesInNextLevel
          q.push(v)
        if nodesInCurrentLevel is 0 do:
          nodesInCurrentLevel = nodesInNextLevel
          nodesInNextLevel = 0
          increment currentLevelIndex
      

      当然,这会将输出打印为级别2:0级别2:2,等等。您可以将当前级别的节点存储在循环中的临时列表中,并根据需要打印。

      我投票将此问题作为主题外的问题结束,因为它是家庭作业。提示:如果这是一项大学作业,我只会提示尝试找到一种方法,将一些特殊值放入队列,例如:级别结束。家庭作业是并不总是脱离实际的编程挑战。任务已经完成并提交,这只是一个我无法理解的额外学分选项。我投票将这个问题作为离题题结束,因为它是家庭作业。提示:如果这是一项大学作业,我只想提示尝试找到一种方法,将一些特殊值放入队列,例如:级别结束。家庭作业并不总是脱离实际编程挑战。作业已经完成并交了,这只是一个额外学分的选择,我想不出来。