我如何使树成为2D数组

时间:2018-11-22 03:12:21

标签: algorithm tree

enter image description here

我正在尝试将树数据结构制作为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())
        {

        }
    }
}

我该怎么办?有什么建议吗?

2 个答案:

答案 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]))