Проверяет понимание обработки частично релевантных деревьев в контексте поиска или фильтрации данных.
В иерархических структурах данных часто возникает ситуация, когда узел сам по себе не соответствует критериям поиска, но его потомки являются релевантными. Простое отбрасывание нерелевантного узла приведет к потере всех его дочерних элементов, что нежелательно.
Необходимо реализовать рекурсивную функцию, которая проверяет каждый узел. Если узел нерелевантен, мы не добавляем его в результат, но продолжаем рекурсивно обрабатывать его потомков. Если потомки релевантны, они добавляются в результат, сохраняя свою иерархию.
function filterTree(node, isRelevant) {
const filteredChildren = (node.children || [])
.map(child => filterTree(child, isRelevant))
.filter(child => child !== null);
if (isRelevant(node)) {
return { ...node, children: filteredChildren };
} else if (filteredChildren.length > 0) {
// Узел нерелевантен, но есть релевантные потомки
return { ...node, children: filteredChildren };
}
return null;
}Этот подход используется в:
Данный метод позволяет гибко обрабатывать иерархические данные, сохраняя релевантные поддеревья даже при нерелевантных родительских узлах. Это особенно полезно в системах, где важна структура данных, а не только отдельные элементы.