解析预序树遍历的序列化

时间:2017-07-02 16:56:14

标签: javascript json node.js tree

我想解析一个String(预订树遍历的序列化)到JSON对象(树的节点和边缘)。

问题

如何提取节点之间的边缘?

字符串表示

String包含节点和节点(边缘)之间的依赖关系。

前进符号将是一个简单的'>'并且空(或反向一级)符号将是一个简单的'<'字符。

示例:

'1>2>5<6<<3>4>7(<<<<)'

提取元素

为了提取元素(节点,边),我使用正则表达式预处理String。

var network_info = '1>2>5<6<<3>4>7(<<<<)';
var network_elements = network_info.replace(/(\(<*\))/,'').match(/<|>|[0-9]/g);

结果是

Array [ "1", ">", "2", ">", "5", "<", "6", "<", "<", "3", ">", "4", ">", "7"]

提取节点

为了提取节点,我定义了函数“getNodes”。

function getNodes(network_elements) {
    var nodes = [];
    var node_id = 1;

    for (var i = 0; i < network_elements.length; i++) {
        if(network_elements[i] != '<' && network_elements[i] != '>') {
            var node = {};
            node.id = node_id++;
            node.label = network_elements[i];
            nodes.push(node);
        }
    }
    return nodes;
}

结果是包含节点的id和标签的JSON对象的列表

[
{id: 1, label: '1'},
{id: 2, label: '2'},
{id: 3, label: '5'},
{id: 4, label: '6'},
...]

问题:边缘

边缘的结果应如下所示(from和to表示相应节点的id。

[
{id: 1, from: 1, to: 2},
{id: 2, from: 2, to: 3},
{id: 3, from: 2, to: 4},
{id: 4, from: 1, to: 5},
{id: 5, from: 5, to: 6},
{id: 6, from: 6, to: 7}
]

伪代码示例

var edges = [];
var edge_id = 1;
var from_node_id = 1;
var to_node_id = 2;

LOOP:

    GET from_node_id

    var edge = {};
    edge.id = edge_id++;
    edge.from = from_node_id;
    edge.to = to_node_id++;
    edges.push(edge);

树结果

字符串'1&gt; 2&gt; 5&lt; 6&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt;

Example Tree

非常感谢任何帮助。

非常感谢-tao

1 个答案:

答案 0 :(得分:0)

您可以使用一堆节点来跟踪根目录的当前路径。推送堆栈上的初始节点。然后,当您看到>X时,将当前堆栈顶部的左边缘添加到节点X并在堆栈上推送X。当您看到<...< Y时,为每个<在堆栈中弹出一个节点,然后从堆栈顶部添加一个新的右边缘到Y

您似乎对JSON详细信息没有任何问题。我会让那些让你锻炼的。