Я должен распечатать (посетить) узлы на одном уровне двоичного дерева.
Я не вижу, как это можно сделать, но потом я не очень разбираюсь в алгоритмах вообще.
Я знаю, что в обходном перекрестке вы используете очередь и начинаете с помещения корневого узла в очередь, после чего вы удаляете его, посещая его и ставьте в очередь его дочерние элементы, а затем вы удаляете первого зарегистрированного ребенка и посещают его детей и так далее ...
И, по моему мнению, это не позволяет точно знать, когда заканчивается один уровень, а другой начинается, если вы не назначаете каждому узлу уровень, когда создается двоичное дерево, а затем просто проверяйте уровень, когда вы делаете Ширина - первый обход.Печать всех элементов на одном заданном уровне двоичного дерева
Что-то вроде этого (код находится на 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;
}
Так что мои вопросы:
это единственный способ печати узлов на одном уровне двоичного дерева?
Есть ли другой способ?
Есть ли другой способ, не сохраняя уровень при создании дерева?
Нуждается первые и вторые пункты перешли или есть нулевой указатель разыменования возможно. Также более естественно сначала посетить левую ветвь! – 2010-01-23 10:41:34
сделано и сделано. Спасибо, сэр. –