【问题标题】:Recursive tree traversal in level order按级别顺序递归树遍历
【发布时间】:2013-06-22 11:02:14
【问题描述】:

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

【问题讨论】:

    标签: node.js tree-traversal


    【解决方案1】:

    使用队列来存储每个级别的节点。使用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 占用的空间是瓶颈,您可以将其替换为其他一些队列实现并稍微改变算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多