Как построить дерево, используя вложенные значения в скобках?

Каков алгоритм построения древовидной структуры на основе вложенных значений, представленных в строке с использованием скобок? Каким образом определяется уровень вложенности при разборе такой строки?
  • 8 мая 2024 г. 14:11
Ответы на вопрос 2
Для построения дерева на основе вложенных значений в скобках, можно использовать рекурсивный алгоритм. Пример строки с вложенными значениями:

"(A(B(C)(D))(E(F)(G)))"

Алгоритм:

1. Начинаем с обхода строки слева направо.
2. При встрече открывающей скобки "(" создаем новый узел дерева.
3. Далее идем до закрывающей скобки ")" и внутри этого узла продолжаем разбор вложенных значений.
4. При встрече новой открывающей скобки создаем новый узел внутри текущего узла.
5. Продолжаем так до тех пор, пока не достигнем конца строки или не закончатся открывающие скобки.
6. Уровень вложенности определяется количеством открывающих скобок до текущего узла.

После применения указанного алгоритма к строке "(A(B(C)(D))(E(F)(G)))" дерево будет следующим:

```
  A
 / \
B   E
   / \
  F   G
```

Таким образом, можно построить дерево, используя вложенные значения в скобках.
конкретно в данном случае (только числа) можно воспользоваться парсингом JSON, предварительно доработав напильником строку 
const result = JSON.parse(
  '(1 (20 (400 5 60 (700) 108 (90)) 3))'
  .replaceAll('(', '[')
  .replaceAll(')', ']')
  .replace(/(\d|\])(?=\s+\d|\s*\[)/g, '$&,'));


----
ну а если по-честному, то надо обходить строку, и либо рекурсией, либо со стеком.

Примерно так:

Сначала парсим строку, получаем токены, в нашем случае это скобки и числа. Обходим токены, имея на руках стек и текущий массив. Если очередной токен - число, добавляем его в текущий массив, если открывашка, то создаем новый массив, добавляем его в текущий, потом текущий кладем в стек, а новый назначаем текущим. Если закрывашка, то забираем массив из стека.
То же самое можно сделать через рекурсию, попробуй сам, если интересно.
Похожие вопросы