Поиск соответствующего узла в клоне бинарного дерева

Обходите исходное дерево и клон синхронно парами узлов. Когда исходный узел совпадёт с 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-стека.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее