Перевернутая форма двоичного дерева — это еще одно двоичное дерево, в котором левые и правые дочерние элементы всех нелистовых узлов поменяны местами. Вы также можете назвать его зеркалом входного дерева.
Вы можете заметить, что левый указатель корня начал указывать на правый дочерний элемент, а правый указатель — на левый дочерний элемент, и аналогичное состояние наблюдается для всех подкорневых узлов.
Рекурсивное решение
Ключевым моментом здесь является понимание того, что для инвертирования двоичного дерева нам нужно только поменять местами дочерние элементы и рекурсивно решить две меньшие подзадачи (та же проблема, но для меньшего размера ввода) левого и правого поддеревьев.
- Когда дерево пусто, верните NULL. Это также наш базовый вариант для остановки рекурсивных вызовов.
- Для каждого обнаруженного узла мы меняем местами его левый и правый дочерние элементы, прежде чем рекурсивно инвертировать его левое и правое поддерево.
var invertTree = function(root) { if(!root) return root; function traverse(node) { if(!node) return null;
const newNode = { val: node.val }; newNode.left = traverse(node.left); newNode.right = traverse(node.right); //swap let temp = newNode.left; newNode.left = newNode.right; newNode.right = temp; return newNode; } return traverse(root); };
Анализ сложности
В приведенном выше подходе мы проходим каждый узел дерева только один раз. Временная сложность: O(n)
Подключаемся в LinkedIn! Пожалуйста, ознакомьтесь с дополнительной информацией по вопросу о структуре данных javascript и не забудьте подписаться на меня, чтобы не пропустить другие подобные статьи.