Php 从链表中计算树节点
我有链接列表形式的树节点连接信息和根节点的ID。我需要按照这样的顺序计算这些节点,结果中任何较低级别的节点都应该比任何较高级别的节点具有更高的数量。编号从根节点的ID值开始,每隔一个节点递增1。同一级别上节点的顺序并不重要。在我开始重新发明轮子和避免陷阱之前,我可以使用什么算法和数据结构来解决这个问题?将使用的语言是纯PHP,数据来自MySQL DB,但欢迎使用伪代码或简单解释之类的任何解决方案 编辑:Php 从链表中计算树节点,php,algorithm,tree,tree-traversal,Php,Algorithm,Tree,Tree Traversal,我有链接列表形式的树节点连接信息和根节点的ID。我需要按照这样的顺序计算这些节点,结果中任何较低级别的节点都应该比任何较高级别的节点具有更高的数量。编号从根节点的ID值开始,每隔一个节点递增1。同一级别上节点的顺序并不重要。在我开始重新发明轮子和避免陷阱之前,我可以使用什么算法和数据结构来解决这个问题?将使用的语言是纯PHP,数据来自MySQL DB,但欢迎使用伪代码或简单解释之类的任何解决方案 编辑: 到目前为止,我想到了这一点(感谢Beta帮助我): 你熟悉广度优先搜索的概念吗?不,我不熟悉
到目前为止,我想到了这一点(感谢Beta帮助我):
你熟悉广度优先搜索的概念吗?不,我不熟悉。你是在建议这个算法作为解决方案吗?谢谢,现在我在维基百科上看到了BFS和DFS,我不得不问在我的情况下哪个更好(完整树遍历,对吧?)BFS更好。首先为根节点分配一个编号。然后迭代它指向的所有节点。然后遍历它们指向的所有节点。然后是它们指向的所有节点,依此类推,直到没有未标记的节点为止。这取决于。如果使用数组_shift,则可能会损失un时间。如果你不这样做,你可能会失去记忆。您可以决定是要实现还是使用队列,但请注意,如果您必须在每个步骤中转移所有内容,那么您的算法将很慢。使用PHP,您可以轻松地使用任意键将子项存储在数组中,对吗?
<?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;
}