Решил подкрепить свою идею надлядным примером работы алгоритма.
Возьмем, например, такое выражение: "CD*E+AB+*FG*-#" (решетка - символ-указатель на просматриваемый элемент)
1) Вход в функцию: рисуем "-" и ветви:
2) Сдвигаем указатель "#" и обнаруживаем на месте первого аргумента "знак операции" "*". Запускаем ту же функцию, но уже строкой: "CD*E+AB+*FG*#-".
3) Отрисовываем "*" и ветви:
Код:
-
/ \
/ \
/ \
/ \
*
/ \
/ \
Отрисовываем аргументы F,G. Знаков операции не обнаружено, поэтому новая функция не запускается, данная функция завершает работу и передается управление самой первой функции. Дерево имеет вид:
Код:
-
/ \
/ \
/ \
/ \
*
/ \
/ \
F G
В первой функции начинает выполняться инструкция 4: но на месте аргумента стоит знак операции "умножение".
Опять вызывается функция tree со строкой "CD*E+AB+*#FG*-" (при каждой отрисовке символа решетка сдвигается на один символ влево)
И так далее. В конце получаем дерево след. вида:
Код:
-
/ \
/ \
/ \
/ \
* *
/ \ / \
/ \ / \
/ \ F G
/ \
+ +
/ \ / \
/ \ / \
A B * E
/ \
/ \
С D