findRepeatingSubtrees method

Map<String, List<Node>> findRepeatingSubtrees()

Находит повторяющиеся поддеревья

Implementation

Map<String, List<Node>> findRepeatingSubtrees() {
  final patterns = <String, List<Node>>{};

  String getSubtreePattern(Node root) {
    final children = getNodeEdges(root).toList()..sort((a, b) => a.key.compareTo(b.key));
    final childPatterns = children.map(getSubtreePattern).join(',');
    return '(${root.key}[$childPatterns])';
  }

  // Собираем паттерны для всех узлов
  for (final node in nodes.values) {
    final pattern = getSubtreePattern(node);
    patterns.putIfAbsent(pattern, () => []).add(node);
  }

  // Оставляем только повторяющиеся
  return Map.fromEntries(
    patterns.entries.where((e) => e.value.length > 1),
  );
}