【问题标题】:Binary Tree Algorithm (Different Approach)二叉树算法(不同的方法)
【发布时间】:2015-08-18 03:36:24
【问题描述】:

我正在尝试为 mysql 二叉树开发一种算法。它是这样工作的:

表“网络”:id_network、父、子、位置

Ir 就是这样工作的,新用户与父母一起进入系统。我搜索父母是否已经有孩子,如果没有,我将新用户添加为父母的孩子和职位。 (如果没有子,先向左,再向右)

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

我有我的 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 个子级。

谁能帮助我现在可以做些什么来实现从左到右的第一个空白空间中的插入。我认为值得关注...我已经搜索了整个互联网,但我想要的方法,我找不到也无法创建。

【问题讨论】:

  • 如果你刚开始,我建议你把它切换到像 mongoDB 这样的 noSQL db,你实际上可以保存引用并将存储的数据构建为树
  • 事实上,我在 MongoDB 方面有很好的经验,使用它会很完美和简单。最大的问题是我的客户端使用的服务器不是 VPC 并且没有 noSQL。
  • 也许很有趣? mysql hierarchy storage with large trees。另外:Nested set model practical examples, part I。所有未经测试的
  • @RyanVincent 非常感谢,伙计。我在那里看了看,似乎是我需要的。干杯

标签: php mysql algorithm binary-tree


【解决方案1】:

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

要制作这样的东西,您必须使用一些东西:

  1. 2 的幂(2、4、8、16、32、64 ...)为您想要的每个级别

  2. 要让孩子在左边,你使用这个 (2*n)

  3. 要让 childrens 正确,请使用 (2*n + 1)

在这种方法中,我使用了这种数据库模式:

Table "network":

id_network (primary key | auto increment)
id_user (int)
location (int)

当您想在树上插入一个新用户时,您从父级位置检查每个级别(使用 2 的幂)。例如:如果我们想插入一个新的“用户”......假设这个新的“用户”有一个父级(他的位置是 3)。

首先我们得到“父”位置。假设父母有位置 3 并且没有孩子。您在插入之前知道新的“用户”将是“父母”的左儿子。但是我们如何将它插入到树中呢?很简单:

您循环遍历 2、4、8 ... 并检查每个级别是否有所有子级,如果没有,则取最后一个子级位置并添加 1+(您获得了新用户的新位置)

一些观察:

要获得每个级别,您可以使用 BETWEEN first_level_number AND last_level_number。要获得第一个数字,请使用公式 (2*n),要获得最后一个数字,请使用 (2*n+1)

我希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2022-11-23
    • 2015-12-05
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多