Гораздо проще "нарисовать" их следующим образом:
+
a
*
b
c
Или, если вы хотите использовать простую графику символов (я изменил операторы +
и *
на Add
и Mul
, чтобы избежать столкновения с графикой):
Add
+-- a
+-- Mul
+-- b
+-- c
Хитрость для этого - нарисовать поддерево отдельно (например, дерево mul
), а затем нарисовать его с помощьюподходящие префиксы при рисовании внешнего дерева.
Фактически, если вы знакомы с потоковыми буферами C ++, вы можете создать потоковый буфер с префиксами, который обрабатывает префиксы, и просто распечатать внутреннее дерево.
Большая разница по сравнению с предложенным вами стилем заключается в том, что ваш стиль просто не масштабируется.Если, например, у верхнего оператора будет два больших поддерева, они были бы очень сильно отделены друг от друга.
РЕДАКТИРОВАТЬ: Можно нарисовать немного более сложное деревокак это:
Add
+---Sub
| +---Div
| | +---p
| | +---q
| +---y
+---Mul
+---b
+---c
РЕДАКТИРОВАТЬ: По запросу, здесь приходит некоторый псевдокод (который, кстати, приемлем для интерпретатора Ruby).Однако вы должны использовать подходящую структуру данных C ++ для представления дерева.
# Return the drawn tree as an array of lines.
#
# node ::= string
# node ::= [string, node, node]
def render_tree(node, prefix0 = "", prefix = "")
if (node.is_a?(String))
puts prefix0 + node # Value
else
puts prefix0 + node[0] # Operator
render_tree(node[1], prefix + "+---", prefix + "| ")
render_tree(node[2], prefix + "+---", prefix + " ")
end
end
render_tree(["Add", ["Sub", ["Div", "p", "q"], "y"], ["Mul", "b", "c"]])