Рекурсия - ваш друг.
Tree TreeFromPreOrder(Stream t) {
switch (t.GetNext()) {
case Leaf: return new LeafNode;
case InternalNode:
Node n = new Node;
n.Left = TreeFromPreOrder(t);
n.Right = TreeFromPreOrder(t);
return n;
default:
throw BadPreOrderException;
}
}
Рассматривая ее как рекурсивный метод, становится легко увидеть, как делать другие вещи.
Например, скажем, мы хотели напечататьInOrder обход.Код будет выглядеть примерно так:
void PrintInorderFromPreOrder(Stream t) {
Node n = new Node(t.GetNext());
switch (n.Type) {
case Leaf: return;
case InternalNode:
PrintInorderFromPreOrder(t);
print(n.Value);
PrintInorderFromPreOrder(t);
default:
throw BadPreOrderException;
}
}
Кроме того, я хотел бы отметить, что это не настолько искусственно.Этот тип представления может фактически использоваться для экономии места, когда нам нужно сериализовать двоичное дерево: Эффективное хранение массива для двоичного дерева .