父数组 n 元树的逐级遍历
Level by level traversal of parent array n-ary tree?
给定一个存储在父数组中的 n 元树,子级存储在指向数组的指针数组中,其中第一个值是子数组的数量:
(childArray[2][0] 显示节点 2 有 2 个子节点,childArray[2][1] 显示它的第一个子节点是 5,依此类推)
parentArray = {3, 0, 3, -1, 3, 2, 2};
childArray = {{1, 1}, {0}, {2, 5, 6}, {3, 0, 2, 4}, {0}, {0}, {0}};
生成如下所示的树:
3
/|
0 2 4
| |
1 5 6
使用队列,我如何逐级输出树,如下所示:
等级 1: 3
等级 2: 0, 2, 4
等级 3: 1, 5, 6
1 级和 2 级很容易,因为 1 级只是根,而 2 级只是它的孩子,但在那之后我不知道如何让它得到孩子的孩子。
一种方法是使用队列数据结构。
从一些队列 q 开始,并放入父项为 -1 的(唯一)项的索引中。现在,在每一步,直到 q 为空,
- 执行 v <- pop(q) (弹出头部)
- 打印出 v
- 对于 v 的每个子 w,执行 push(q, v) (推动尾巴)
例如,以下是您的案例的第一步:
- 最初,q = [3](3 是父项为 -1 的项目的索引)。
- 我们弹出 q,打印出 3,然后按 0、2 和 4,所以 q = [0, 2, 4]。
- 现在我们弹出 q,打印出 0,然后按 1,所以 q = [2, 4, 1]。
几乎根据定义,由于 q 是从前面弹出并添加到后面的,因此节点将逐级处理。
复杂性在节点数量上呈线性关系。
您必须在树上执行BFS(广度优先搜索),同时保持推送到下一级别的节点数。大纲:
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,依此类推。您可以将当前级别节点存储在循环内的临时列表中,并根据需要进行打印。
相关文章:
- 遍历并行数组以确定C++中的最大数字
- 遍历二维数组的所有子数组
- 遍历向量与数组哪个更快?
- 是否可以遍历传递给函数的数组?
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 数组数据以错误的方式遍历 Python/Matlab
- 结构化绑定:遍历元组的双端面
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 如何使用指针遍历结构数组中的数组
- 程序在遍历所有值之前离开循环. 数组的
- 按顺序遍历 AVL 树,将值保存在数组中
- 数组 - 循环遍历辅助阵列
- 在C++中循环遍历二维数组时改进 O(n)
- IOS objective-C 循环遍历 2 个数组
- 如何修复我的代码并使其遍历 2D 数组中的所有行?(C++)
- 遍历元组 c+17 样式的向量不起作用?
- 如何遍历充满结构的数组
- 数组 通过指针遍历
- 在常量数组上使用指针遍历