如何存储大型二叉树(大约数千个)。 我们试图将数据存储在表格中,包括行:elem,parent,left_child,right_child 但处理这棵树的速度很慢(计算,绘制一部分)。
你推荐哪种方式? (计算可以在php中完成)。可能是将它存储在XML或json(文本文件)或某些矩阵中?
答案 0 :(得分:0)
您可以使用数组或其他线性存储(例如,关系id->节点值),方法是每个节点x具有子节点2 * x和2 * x + 1。如果树不平衡,问题可能是有未使用的ID。
样品:
2---4---8
/ \ \9
1-- 5---10
\ \11
3---6---12
\ \13
7---14
\15
答案 1 :(得分:0)
似乎像你建议的那样写一些类似XML的东西。转换为XML然后在想要重新加载时返回它将非常简单。
答案 2 :(得分:0)
我使用的结构如下
id parent tree slug name path children
1 0 1 root Root || |5|
2 7 1 child-1 Child 1 |1-5-8-7| |3|
查询大深度树非常容易,因为查询是线性的。 每行中都有更多的数据,但这样可以更快。
例如,您可以使用简单的查询获取整个子树:
$sql = 'SELECT * FROM `'.$this->_table_name.'` WHERE
`path` LIKE "%-:parent-%"
OR `path` LIKE "%|:parent-%"
OR `path` LIKE "%-:parent|%"
OR `path` LIKE "%|:parent|%"';
$result = $this->_db->custom_query($sql, array('parent' => $root->id));
然后通过一个简单的函数构建深度数组:
private function _build_tree(Node $root, $data)
{
$mapped_node = array(
'node' => $root,
'subnodes' => array()
);
if ( !empty($root->children) )
{
foreach( $root->children as $child )
{
if ( array_key_exists($child, $data) )
{
$mapped_node['subnodes'][] = $this->_build_tree($data[$child], $data);
}
}
}
return $mapped_node;
}
请注意!当我找回子和路径列时,我将它们拆分为PHP数组,以便能够更好地使用它们。