Мне необходимо распечатать (посетить) узлы на одном уровне двоичного дерева.
Я не понимаю, как это можно сделать, но опять же я не очень разбираюсь в алгоритмах в целом.
Я знаю, что при обходе в ширину вы используете очередь, и вы начинаете с того, что помещаете корневой узел в очередь, затем удаляете его из очереди, посещаете его и ставите в очередь его детей, а затем вы удаляете из очереди первого запрашиваемого дочернего элемента, посещаете его и ставите в очередь его детей и т.д. на ...
И, насколько я понимаю, невозможно точно знать, когда заканчивается один уровень и начинается другой, если вы не назначаете каждому узлу его уровень при создании двоичного дерева, а затем просто проверяете уровень, когда выполняете обход в ширину.
Как-то так (код написан на PHP, но это не вопрос, связанный с PHP, это вопрос общего алгоритма - это часть функции, которая добавляет узел в двоичное дерево, сохраняя уровень в узле, когда каждый узел добавлен):
if($this->root == null)
{
$this->root = $node;
$this->root->level = 1;
return;
}
$nextnode = $this->root;
$level = 1;
while (true)
{
if($node->value > $nextnode->value)
{
if($nextnode->right != null)
{
$nextnode = $nextnode->right;
$level++;
}
else
{
$nextnode->right = $node;
$nextnode->right->level = ++$level;
return;
}
}
else if($node->value < $nextnode->value)
{
if($nextnode->left != null)
{
$nextnode = $nextnode->left;
$level++;
}
else
{
$nextnode->left = $node;
$nextnode->left->level = ++$level;
return;
}
}
else if($node->value == $nextnode->value)
return;
}
Итак, мои вопросы:
Является ли это единственным способом печати узлов на одном уровне двоичного дерева?
Есть ли другой способ?
Есть ли другой способ без сохранения уровня при создании дерева?