Вы отмечаете конец слова, сохраняя специальный дозорный ключ '#'
в объектах, составляющих узлы вашего дерева. Значения, связанные с ключами, являются узлами-потомками для следующей буквы, но значение, связанное с ключом часового типа, является строкой.
При поиске в глубину вы перебираете все ключи в узле, и если ключ - страж, вы добавляете слово, которое вы создали до сих пор. Но затем вы также возвращаете ключ дозорного и передаете строку как новый root узел. В следующей рекурсии l oop
for (const key in root) ...
перебирает символы строки, которая перечисляет ее символы:
{0: 't', 1: 'r', 2: 'i', 3: 'e'}
Следующая рекурсия будет перебирать символы, то есть над однобуквенными строками. И так далее. Чрезмерная рекурсия не исходит от tr ie, но когда вы случайно покинете tr ie и вернетесь в строки.
Если вы используете true
в качестве значения для сторожевого ключа, есть перебирать нечего, поэтому проблема не возникает.
Решение состоит в том, чтобы выполнять рекурсию только в том случае, если ключ не является стражем:
for (const key in root) {
if (key === '#') {
// add found string to list ...
} else {
this.dfs(root[key], char + key, foundStrings);
}
}
(Кстати, нет ничего плохого в сохранении строки как конечного маркера как таковой. Обычно можно составить слово из пути через tr ie, но рассмотрим tr ie, в котором хранятся цифры словаря T9 где вы можете сохранить список допустимых слов в конечных узлах.)