Обходите исходное дерево и клон синхронно парами узлов. Когда исходный узел совпадёт с targetNode по идентичности, верните парный узел клона.
Поиск соответствующего узла в клоне бинарного дерева
Обходите исходное дерево и клон синхронно парами узлов. Когда исходный узел совпадёт с targetNode по идентичности, верните парный узел клона.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Даны два бинарных дерева: исходное и его клон, а также ссылка на целевой узел в исходном дереве. Требуется найти узел в клонированном дереве, который является точной копией целевого, и вернуть ссылку на него.
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def getTargetCopy(self, src, copy, targetNode):
"""
:type src: TreeNode
:type copy: TreeNode
:type targetNode: TreeNode
:rtype: TreeNode
"""
# TODO
Примеры:
- Вход: tree = [7,4,3,null,null,6,19], target = 3 → Выход: 3
- Вход: tree = [7], target = 7 → Выход: 7
- Вход: tree = [8,null,6,null,5,null,4,null,3,null,2,null,1], target = 4 → Выход: 4
Ограничения:
- Количество узлов в дереве от 1 до 10⁴
- Все значения в дереве уникальны
- Целевой узел гарантированно существует и не равен null
Ответ
Обходите исходное дерево и клон синхронно парами узлов. Когда исходный узел совпадёт с targetNode по идентичности, верните парный узел клона.
class Solution:
def getTargetCopy(self, src, copy, targetNode):
stack = [(src, copy)]
while stack:
original, cloned = stack.pop()
if original is None:
continue
if original is targetNode:
return cloned
stack.append((original.right, cloned.right))
stack.append((original.left, cloned.left))
return None
Структурное соответствие обеспечено условием, что второе дерево — клон. Проверка is ищет именно переданный объект, поэтому решение работало бы даже при повторяющихся значениях. Итеративный обход безопаснее рекурсии для цепочки из 10000 узлов. Время O(n), память O(h) для DFS-стека.