findRepeatingSubtrees method
Находит повторяющиеся поддеревья
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),
);
}