Как получить свободный слот вниз по двоичному дереву, используя метод дерева смежности

0

Я создаю веб-сайт, который требует от пользователей присоединиться к рефереру. Структура данных должна быть двоичной, поэтому, если у реферера уже есть два дочерних элемента в своем непосредственном нижнем уровне, то упомянутый новый пользователь должен быть помечен под одним из пользователей под ссылкой для реферера, предпочтительно, чтобы первый пользователь был отправлен чтобы они не имели более двух пользователей непосредственно под ними. Я строю эту систему с помощью codeigniter, и мой код похож на этот

public function get_referred_by($refer_id)
{
    $where = array('referral_id' => $refer_id);
    $parent = $this->get_by($where, true);
    $children = $this->db->select('referral_id')
                ->where('refer_id', $parent->referral_id)
                ->order_by('users.id desc')
                ->limit('2')
                ->get('users')->result();
    if(count($children) > 1)
    {
        for($i = 0; $i<count($children); $i++) 
        {
            $parent = $this->get_referred_by($children[$i]->referral_id);
        }
    }       
    return $parent; 
}

проблема в том, что с помощью этого кода я могу пропустить нижние линии, чтобы найти следующий открытый слот, но вместо того, чтобы сначала переходить по нижестоянию, чтобы проверить, есть ли у следующего пользователя свободные слоты, система застревает на одном дереве. например, пользователь A присоединяется к пользователям B и C, а затем B присоединяется к D и E, то, что я хочу, - это когда используется идентификатор пользователя как 'ref id, вместо того, чтобы возвращать номер пользователя Ds', он возвращает пользователя Cs '. Пожалуйста помоги

  • 0
    Зачем делать это двоичное дерево? Почему бы не сделать это N-арным деревом (родитель может иметь любое количество прямых потомков)? Метод списка смежности очень хорошо работает для N-арных деревьев.
  • 0
    Система требует двоичного дерева. Каждый пользователь должен иметь под собой максимум двух пользователей.
Теги:
codeigniter

1 ответ

0

Если вы всегда хотите выбрать более раннего (левого) ребенка, тогда нет необходимости перебирать детей, просто выберите первый:

if(count($children) > 1)
{
    $parent = $parent = $this->get_referred_by($children[0]->referral_id);
}      
  • 0
    Это действительно то, что происходит, когда я запускаю свой код, но вместо этого я хочу, чтобы у самого левого ребенка было 2 ребенка, тогда он должен проверить, есть ли у правого ребенка пустой слот, т. Е. 1 ребенок, и поместить туда ребенка.
  • 0
    Разве это не произойдет автоматически на уровне выше, так как не будет верно, что count($children) > 1 ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню