大树上的二叉树高度表现

时间:2015-08-17 03:40:49

标签: php mysql tree binary-tree

我正在mysql数据库中的表上存储二叉树。 该表包含 id parent 列以及其他不重要的列。 这些专栏是不言自明的。

我设法获得树的高度:

    $depth = 0;
    /* @var $db PDO */
    $stmt = $db->prepare( "SELECT id FROM wp_members WHERE parent = :parent AND matrix_id = :matrix_id" );

    $q = new SplQueue();
    $q->push( array( 0, 0 ) );

    while (!$q->isEmpty()) {
        $cur = $q->pop();

        $stmt->bindParam( ':parent', $cur[0] );
        $stmt->bindParam( ':matrix_id', $matrix_id );

        $stmt->execute();

        $ids = $stmt->fetchAll();

        if ($cur[1] > $depth) $depth++;

        if (count($ids) > 0) $q->add( 0, array( $ids[0]['id'], $cur[1] + 1));
        if (count($ids) > 1) $q->add( 0, array( $ids[1]['id'], $cur[1] + 1));
    }

    return $depth;

PS:matrix_id =>让我们调用树ID

它返回树的高度正确,但问题是数据库有超过18k的节点,这需要花费很多时间才能获得树高。

我想知道的是我能做些什么来解决这种情况?获得树的高度需要60多秒。

1 个答案:

答案 0 :(得分:0)

我使用了@ M0rtiis提出的解决方案:

ALTER TABLE `wp_members` ADD `depth` INT UNSIGNED NOT NULL AFTER `parent`;

我写了一个脚本来旅行存储关卡的树。

之后我很简单:

$sql = $wpdb->prepare( "SELECT MAX(depth) FROM wp_members WHERE matrix_id = '%d'", $matrix_id );
$height = $wpdb->get_var( $sql );

return $height === NULL ? 0 : $height;

并得到了树的高度;)

PS:我选择@ M0rtiis解决方案,因为它看起来很简单,而在其他功能中,我需要通过指定级别来获取所有节点。