Сложность: medium
Дано бинарное дерево, такое что каждый узел содержит дополнительный случайный указатель, который может указывать на любой узел в дереве или быть null.
Верните глубокую копию дерева.
Дерево представлено в том же формате ввода/вывода, что и обычные бинарные деревья, где каждый узел представлен в виде пары [val, random_index], где:
- val: целое число, представляющее Node.val
- random_index: индекс узла (во входных данных), на который указывает случайный указатель, или null, если он не указывает ни на один узел.
Вам будет дано дерево в классе Node, и вы должны вернуть клонированное дерево в классе NodeCopy. Класс NodeCopy является клоном класса Node с такими же атрибутами и конструкторами.
Пример:
Input: root = [[1,null],null,[4,3],[7,0]]
Output: [[1,null],null,[4,3],[7,0]]
Explanation: The original binary tree is [1,null,4,7].
The random pointer of node one is null, so it is represented as [1, null].
The random pointer of node 4 is node 7, so it is represented as [4, 3] where 3 is the index of node 7 in the array representing the tree.
The random pointer of node 7 is node 1, so it is represented as [7, 0] where 0 is the index of node 1 in the array representing the tree.
👨💻 Алгоритм:
1⃣Глубокое копирование дерева:
Инициализируйте хэш-таблицу newOldPairs, которая сопоставляет узлы старого дерева с узлами нового дерева.
Создайте функцию deepCopy(root), которая принимает корень данного дерева и возвращает корень нового дерева. Эта функция создаёт новый узел с теми же значениями, что и корневой узел, и рекурсивно копирует левое и правое поддеревья. Затем она сохраняет пару старого и нового узлов в хэш-таблицу и возвращает новый корень.
2⃣Сопоставление случайных указателей:
Создайте функцию mapRandomPointers(oldNode), которая принимает корень старого дерева и рекурсивно сопоставляет случайные указатели нового дерева с соответствующими узлами старого дерева, используя хэш-таблицу newOldPairs.
3⃣Возвращение клонированного дерева:
Создайте глубокую копию дерева, используя функцию deepCopy(root), и сопоставьте все случайные указатели нового дерева с помощью функции mapRandomPointers(root). Верните новый корень.
😎 Решение:
function Node(val, left, right, random) {
this.val = val;
this.left = left;
this.right = right;
this.random = random;
}
function NodeCopy(val, left, right, random) {
this.val = val;
this.left = left;
this.right = right;
this.random = random;
}
var copyRandomBinaryTree = function(root) {
let newOldPairs = new Map();
function deepCopy(node) {
if (!node) return null;
let newNode = new NodeCopy(node.val);
newNode.left = deepCopy(node.left);
newNode.right = deepCopy(node.right);
newOldPairs.set(node, newNode);
return newNode;
}
function mapRandomPointers(node) {
if (!node) return;
let newNode = newOldPairs.get(node);
if (newNode) {
newNode.random = newOldPairs.get(node.random);
mapRandomPointers(node.left);
mapRandomPointers(node.right);
}
}
let newRoot = deepCopy(root);
mapRandomPointers(root);
return newRoot;
};Ставь 👍 и забирай 📚 Базу знаний