如何从二叉树数据库

时间:2016-03-08 16:37:44

标签: php mysql phpmyadmin

这是我的桌子的假人

table

  • 第一个节点是1
  • LorR定义子项是ini left(0)或Right(1)
  • 第一个节点有两个子节点2和3在左和右
  • 第二个节点有两个子节点4和5在左和右
  • 第3个节点在左和右
  • 中有两个子节点6和7
  • 第4个节点有两个子节点8和9,左和右
  • 第5个节点在左侧有一个子节点10
  • 第6个节点在左侧有一个子节点11
  • 第7个节点在右侧
  • 中有一个子节点12

现在,如果我想查找每个级别中任何父节点的子节点总数 对于前...

  • 节点2(父母)在1级和1级中有2个孩子(4,5)。 2个子节点(8,9) 在第2级
  • 节点6(父级)在级别1中有1个子级(11)
  • 节点3(父母)在1级和1级中有2个孩子(6,7)。 2个子节点 (11,12)在第2级

如何使用php实现这一点? 我的代码是 code

1 个答案:

答案 0 :(得分:0)

根据我的理解,您应该将表转换为信息丰富的PHP数组,例如:

$a = array(
    1 => array(
        'children' => array(
            array(2, 'left'),
            array(3, 'right'),
        ),
        'level' => 0
    ),
    2 => array(
        'children' => array(
            array(4, 'left'),
            array(5, 'right'),
        ),
        'level' => 1
    ),
...        
    12 => array(
        'children' => array(),
        'level' => 3
    ),
);

这个任务非常简单,只需获取表格然后foreach并将每一行分配到相关的数组中。 这是让所有孩子都有计算的功能:

function getChildrenCount($nodeId, $a, $rootLevel)
{
    $leftChildren = array();
    $rightChildren = array();
    $countCurrentNode = 0;
    $level = $a[$nodeId]['level'] - $rootLevel;
    if (empty($a[$nodeId]['children'])) {
        return array($level => 1);
    } else {
        foreach ($a[$nodeId]['children'] as $children) {
            if ($children[1] == 'left') {
                $leftChildren = getChildrenCount($children[0], $a, $rootLevel);
                $countCurrentNode++;
            }
            if ($children[1] == 'right') {
                $rightChildren = getChildrenCount($children[0], $a, $rootLevel);
                $countCurrentNode++;
            }
        }

        $current = $leftChildren;
        foreach ($rightChildren as $rightLevel => $count) {
            if (isset($current[$rightLevel])) {
                $current[$rightLevel] += $count;
            } else {
                $current[$rightLevel] = $count;
            }
        }
        $current[$level] = $countCurrentNode;
        return $current;
    }
}

这个想法是递归遍历每个节点,然后根据它的级别计算子节点数(与根级别相比)

如何致电:

getChildrenCount(2, $a, $a[2]['level'])

它将返回数组(level => count):

array (size=3)
0 => int 2 // level 1
1 => int 3 // level 2
2 => int 3 // Should be removed

然后你应该删除最后一个元素 - 它没用,因为它用来逐级计算孩子。

注意:

  1. 应该有更好的方法来组织数据(数组$ a),以便更容易实现getChildrenCount()。
  2. 此代码未经过仔细测试,仅在某些情况下进行了检查。