如何存储大二叉树

时间:2011-05-13 20:25:25

标签: php binary-tree

如何存储大型二叉树(大约数千个)。 我们试图将数据存储在表格中,包括行:elem,parent,left_child,right_child 但处理这棵树的速度很慢(计算,绘制一部分)。

你推荐哪种方式? (计算可以在php中完成)。可能是将它存储在XML或json(文本文件)或某些矩阵中?

3 个答案:

答案 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数组,以便能够更好地使用它们。