我正在尝试将树数据结构制作为2D数组。 我试图用这样的for循环来做到这一点。 childs()函数返回子节点数组。
void makeArray(a 1_level_a)
{
for(2_level_a : 1_level_a.childs())
{
for(3_level_a : 2_level_a.childs())
{
}
}
}
我该怎么办?有什么建议吗?
答案 0 :(得分:2)
您可以按行写入数组。以下代码假定树木只有深度3:
array[0][0] = 1_level_a;
int last_index = 0;
for (2_level_a : 1_level_a.childs()) {
array[1][last_index] = 2_level_a;
for (3_level_a : 2_level_a.childs()) {
array[2][last_index] = 3_level_a;
last_index++;
}
if (2_level_a.childs().size() == 0) {
last_index++;
}
}
如果需要处理更大深度的树,则可以使用递归:
int writeTree(node, depth, last_index) {
array[depth][last_index] = node;
for (child : node.childs()) {
last_index = writeTree(child, depth + 1, last_index);
}
if (node.childs().size() == 0) {
last_index++;
}
return last_index;
}
writeTree(1_level_a, 0, 0);
请注意,这与上述算法相同,但是以上算法假定深度为3的节点没有子代。
答案 1 :(得分:1)
这是一个可以立即运行的解决方案,它对标准BFS进行了一些修改,并且已经过多个级别的测试。每当从当前节点添加多个子代时,该算法都会移动前一行。此外,它还会在迭代特定级别时跟踪总移位,以了解在哪里插入从子级冒出来的空白单元格。最后,当它在树的最后一级之前命中叶子时,它会向下传播占位符空白节点。当我们的队列仅被这些虚拟节点填充时,我们知道可以停止。
class Node:
def __init__(self, val):
self.val = val
self.children = []
def add_children(self, children):
self.children = children
a = Node("a")
a1 = Node("a1")
a2 = Node("a2")
a3 = Node("a3")
a11 = Node("a11")
a12 = Node("a12")
a31 = Node("a31")
a.add_children([a1, a2, a3])
a2.add_children([a11, a12])
a3.add_children([b1, b2, b3])
a12.add_children([b4])
b2.add_children([b5, b6])
arr = [[a.val]]
queue = [a]
to_process = 1
processed = 0
shifted = 0
while not all(e.val == "" for e in queue):
node = queue[0]
processed+=1
children = node.children if len(node.children) > 0 else [Node("")]
if(to_process==processed):
arr.append(list(map(lambda x: x.val, children)))
to_process = len(queue)
queue+=children
processed = 0
shifted = 0
else:
arr[-1] += list(map(lambda x: x.val, children))
queue += children
queue = queue[1:]
for i in range(0, len(arr)-1):
arr[i] = arr[i][0:shifted+1] + [""] * (len(children)-1) + arr[i][shifted+1:]
shifted += len(children)
print("arr: " + str(arr[:-1]))