Обход дерева

Доброго вам дня всем! Есть некоторые вопросы по одной задаче из теории. Прошу помочь в них разобраться
Код:

const tree = ['A', [
	['B', [
		['E'],
		['F']
	]],
	['C'],
	['D', [
		['G'],
		['J']
	]],
]];

// В коде используются два разных map. Один самописный, другой на массиве.

const map = (f, tree) => {
	const [, children] = tree;
	const [newName] = f(tree);
	if (!children) {
		return [newName];
	}
	return [newName, children.map((c) => map(f, c))];
};

const mappedTree = map(([name]) => [name.toLowerCase()], tree);

Вопросы:

Из-за того что нет описания задачи сложно объяснить причину происходящего. В будущем добавляй не только код решения, но и описание проблемы-задачи.

На вопросы сложно ответить потому что они предполагают что код должен быть другим. Но будучи другим, код не будет решать поставленной задачи. Иными словами если ты напишешь код как в предположении (как в первом вопросе - применишь код к детям, а не к первому элементу), то задача не будет решена.

Механика алгоритма такая, то функцию нужно применить к текущему узлу, и если есть дети, то к детям. Это в коде и описано.

Попробую дать альтернативную перспективу на задачу, может вопросы отпадут. Для первого вопроса. tree на первой и последующих итерациях это элемент дерева. Структурно что дерево что его элемент неотличимы. Можно сказать что каждый элемент это полноценное дерево. Так что функция трансформации точно должна быть применена к элементу. Тут нет никаких вариантов.

Второе. Элемент дерева может содержать в себе еще элементы (или поддеревья). И тогда их трансформация означает взять каждый элемент и вызывать функцию трансформации f с ним как аргументом. Дети удобным образом находятся в массиве. Значит достаточно создать новый массив из элементов (Array.map), пропущенных через функцию трансформации (f). Тут нюанс в том что дети могут иметь детей и чем напрямую вызывать f (что не гарантирует обработку последующих детей), мы вызываем map рекурсивно. Ведь из первого вопроса мы поняли что она умеет трансформировать отдельный элемент.

Спасибо вам большое за ответ и за совет! Я учту его! У меня ещё один вопрос, но его я задам отдельно!

Если нет возражений - давай на ты. Рад быть полезным.

1 лайк