Ну я построить базовый Двоичное дерево, используя класс под названием Node
для простоты я буду включать в себя метод ядра, который используется для insert
УзловPHP Двоичное дерево, Как Traverse
public function addNode($node)
{
if ($this->left == null && $node->getValue() < $this->value) {
$this->left = $node;
$this->left->parent = $this;
return;
}
if ($this->right == null && $node->getValue() > $this->value) {
$this->right = $node;
$this->right->parent = $this;
return;
}
if ($node->getValue() < $this->getValue()) {
$this->left->addNode($node);
return;
}
if ($node->getValue() > $this->getValue()) {
$this->right->addNode($node);
return;
}
}
У меня есть эти основные элемента vars в классе узлов
private $left = null;
private $right = null;
private $value = null;
private $parent = null;
Я могу построить дерево, просто добавив к нему узлы.
$node = new Node(5);
$node->addNode(new Node(7));
$node->addNode(new Node(3));
$node->addNode(new Node(4));
Теперь вопрос в том, как я пересекаю дерево, если хочу напечатать красивую текстовую диаграмму дерева. Я смущен тем, как правильно перемещаться на определенном уровне дерева. я пропустил важную переменную при построении дерева?
Право пересечения является одним из двух случаев: если мы оставлены, правое право $ parent-> находится справа от нас. Если мы правы, мы должны перерасти в родительский-родительский-родительский и использовать крайний левый путь до нашего уровня. –
@EugenRieck, чтобы напечатать дерево, мне нужно было бы пересекать прямо через поддеревья вправо? – DevZer0
Это зависит от вашего определения «печать» - если вы можете свободно позиционировать элементы (например, с помощью «position: absolute»), вы можете просто нарисовать их «по мере их поступления» (пересекая дерево, обычно используя левый путь, но если он не существует или уже был нарисован, выбрал правильный). –