二叉树算法(不同方法)

时间:2015-08-14 18:31:48

标签: php mysql algorithm binary-tree

我正在尝试为mysql二叉树开发算法。它的工作原理如下:

表“网络”:id_network,父级,子级,职位

Ir就是这样,新用户与父母一起进入系统。我搜索父母是否已经有孩子,如果不是,我将新用户添加为父母和孩子的孩子。 (如果没有childer,先左转,然后右转)

每个父母只能有两个孩子,所以下一个孩子必须是他的孙子,依此类推。 (从左到右)

我有我的PHP代码:

function insertUser($user, $parent) {

    $childs = $db -> read('parent =' . $parent); // Return an array with the results from network

    $data['parent'] = $parent;
    $data['child'] = $user;

    if(!$childs[0]) {            
        $data['position'] = 'left';
        $db -> insert($user);
    }else{
        if(!$childs[1]) {
            $data['position'] = 'right';
            $db -> insert($user);
        }
    }
}

我有这个块,我知道只有这样我才能遍历整棵树,即使有300个孩子低于父母。

有人可以帮助我现在我可以做什么来实现从左到右插入第一个空白区域。我认为值得注意的是......我已经整个互联网,但我想要的方法,我找不到,也不能创造。

1 个答案:

答案 0 :(得分:0)

经过大量搜索,研究和@Ryan Vincenti分享的惊人链接 - 我得到了解决方案。

要制作类似的东西,你必须使用一些东西:

  1. 您想要的每个等级的2(2,4,8,16,32,64 ......)的力量

  2. 为了让孩子们离开,你可以使用这个(2 * n)

  3. 为了让孩子们正确,你可以使用它(2 * n + 1)

  4. 在这种方法中,我使用了这种db方案:

    Table "network":
    
    id_network (primary key | auto increment)
    id_user (int)
    location (int)
    

    如果要在树上插入新用户,请从父级位置检查每个级别(使用2的幂)。例如:如果我们想要插入一个新的"用户" ...让我们说这个新的"用户"有父母(他的位置是3)。

    首先我们得到了#34;父母"地点。让我们说父母有位置3并且没有孩子。你知道在插入新的"用户"将是"父母"的左儿子。但是我们如何将它插入树中呢?很简单:

    你循环2,4,8 ...并检查每个级别是否有所有孩子,如果没有,你采取最后一个孩子的位置并添加1+(你有新用户的新位置)

    一些观察结果:

    要获得每个级别,您可以使用BETWEEN first_level_number和last_level_number。要获得您的第一个号码,请使用公式(2 * n)并获得最后一个,使用(2 * n + 1)

    我希望这有助于其他人。