我有以下递归数据结构和迭代它的方法。在这样做的同时,它应该为每个节点添加唯一的号码n
,例如它在树的level order traversal中的相应数字。
var data = {
children: [
{ children: [ ... ] },
{ children: [ ... ] },
{ children: [ ... ] },
...
]
}
var process = function (node) {
node.children.forEach(child, function () {
process(child);
});
return node;
}
如何在不更改数据结构和对处理功能进行最小更改的情况下实现此目的? process(data)
的结果应为
var data = {
n: 1
children: [
{ n: 2, children: [ ... ] },
{ n: 3, children: [ ... ] },
{ n: 4, children: [ ... ] },
...
]
}
答案 0 :(得分:3)
使用队列存储每个级别的节点。使用null
标记一个级别的结尾。
最初,将根节点和null
推送到队列。然后迭代队列,将每个节点的子节点推送到队列并标记非null元素。当您遇到null
元素时,请推送一个新元素。因此,两个结果null
标志着迭代的结束。
var process = function (node) {
var queue = [node, null];
var i = 0, n = 1;
while (queue[i] != null || (i == 0 || queue[i-1] != null)) {
if (queue[i] == null) {
queue.push(null);
}
else {
queue[i].n = n++;
queue[i].children.forEach(function (elem) {
queue.push(elem);
});
}
i++;
}
}
process(data);
console.log(data);
我使用了一个数组作为队列,并没有使访问过的元素出列( O(n)所需空间)。如果queue
占用的空间是瓶颈,您可以将其替换为其他一些队列实现并稍微改变算法。