Трансформация дерева с простыми операциями
От: Flem1234  
Дата: 04.06.25 11:02
Оценка:
Привет
Пытаюсь починить парсер нашего рабочего доморощенного язычка и внезапно понял что мозг атрофировался за годы роботы в кровавом энтерпрайсе.

Итак, задача — есть дерево в котором два типа нодов — листья со значениями и узлы с операциями. Пусть операций два типа — сложение и умножение.
Надо заполнить структуру данных, которая содержит группы операций умножения, разделенные группами сложения, это неоходимо для заполнения другой структуры данных, которая потом отправится на удаленный сервак.

Т.е. выражение, распаршеное в дерево:
(a+b)*(c+d)*e должно превратиться в такое a*c*e+a*d*e+b*c*e+b*d*e.

      *
     / \
    *   e
   / \
  +   +
 / \ / \
a  b c  d

в
                        +
              ___________|___________
             /                       \
            +                         +
         ___|___                   ___|___
        /       \                 /       \
      (*       (* )            (* )      (* )
     /   \    /    \           /    \    /    \
   (* )  e   (* )  e         (* )   e  (* )   e
   /  \       /  \           /  \      /  \
  a    c     a    d         b    c    b    d


Какие идеи?
Спасибо.
Re: Трансформация дерева с простыми операциями
От: kov_serg Россия  
Дата: 04.06.25 12:35
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Т.е. выражение, распаршеное в дерево:

F>(a+b)*(c+d)*e должно превратиться в такое a*c*e+a*d*e+b*c*e+b*d*e.

То есть вы хотите просто раскрыть скобки? И в чем проблема?
Re[2]: Трансформация дерева с простыми операциями
От: Flem1234  
Дата: 04.06.25 14:53
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, Flem1234, Вы писали:


F>>Т.е. выражение, распаршеное в дерево:

F>>(a+b)*(c+d)*e должно превратиться в такое a*c*e+a*d*e+b*c*e+b*d*e.

_>То есть вы хотите просто раскрыть скобки? И в чем проблема?


По сути да.

И в чем проблема?

Проблема была в моей тупости. Нашел багу, просто переписал код на чистовую, в прошлой версии видимо где-то забыл сделать рекурсивный вызов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.