递归树遍历级别顺序

时间:2013-06-21 21:56:31

标签: node.js tree-traversal

我有以下递归数据结构和迭代它的方法。在这样做的同时,它应该为每个节点添加唯一的号码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: [ ... ] },
        ...
    ]
}

1 个答案:

答案 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占用的空间是瓶颈,您可以将其替换为其他一些队列实现并稍微改变算法。

相关问题