来自链表的数字树节点

时间:2014-06-23 05:13:57

标签: php algorithm tree tree-traversal

我以链表的形式和根节点的ID形式存在树节点连接信息。我需要按照这样的顺序对这些节点进行计算,使得结果中的任何较低级别节点的数量应该高于任何较高级别的节点。编号从根节点的ID值开始,并为每个其他节点递增1。同一级别的节点顺序并不重要。在开始重新发明轮子并避免陷阱之前,我可以使用哪些算法和数据结构来解决这个问题?将使用的语言是纯PHP,数据来自MySQL DB,但欢迎使用任何解决方案,如伪代码或简单解释。

编辑:
到目前为止,我想到了这一点(感谢Beta帮助我):

<?php

$data = array(
    array(551285, 551286),
    array(551286, 551290),
    array(551286, 551297),
    array(551288, 551432),
    array(551289, 552149),
    array(551290, 551292),
    array(551292, 551294),
    array(551296, 551355),
    array(551296, 552245),
    array(551297, 551299),
    array(551299, 551301),
    array(551299, 551304),
    array(551304, 551306),
    array(551306, 551307),
    array(551307, 551308),
    array(551308, 551309),
    array(551309, 551312),
    array(551311, 551328),
    array(551312, 551313),
    array(551313, 551315),
    array(551315, 551316),
    array(551316, 551317),
    array(551286, 551288),
    array(551286, 551289),
    array(551286, 551320),
    array(551290, 551322),
    array(551292, 551324),
    array(551294, 551296),
    array(551294, 551326),
    array(551297, 551342),
    array(551299, 551344),
    array(551301, 551303),
    array(551304, 551346),
    array(551307, 551349),
    array(551309, 551311),
    array(551309, 551353),
    array(551313, 551357),
    array(551317, 552094),
    array(551286, 551287),
    array(551290, 551291),
    array(551292, 551293),
    array(551294, 551295),
    array(551297, 551298),
    array(551299, 551300),
    array(551301, 551302),
    array(551304, 551305),
    array(551309, 551310),
    array(551313, 551314)
);

var_dump(numerateTreeNodes($data, 551285));

function numerateTreeNodes($linked_nodes, $root_node)
{
    $numbered_nodes = array();
    $queue = new SplQueue();
    $queue->enqueue($root_node);
    $counter = $root_node;
    $children_grouped = groupDirectChildren($linked_nodes);

    while ($queue->count()) {
        $t = $queue->dequeue();
        $numbered_nodes[$counter++] = $t;
        if (isset($children_grouped[$t])) {
            foreach ($children_grouped[$t] as $t_child) {
                $queue->enqueue($t_child);
            }
        }
    }
    return $numbered_nodes;
}

function groupDirectChildren($nodes)
{
    $grouped = array();
    foreach ($nodes as $n) {
        $grouped[$n[0]][] = $n[1];
    }
    return $grouped;
}

有任何建议/更正吗?

0 个答案:

没有答案