Сегодня мы собираемся решить ту же задачу о деревьях, где вам даны два бинарных дерева, и мы должны сравнить их и посмотреть, идентичны ли они или нет.

Имея корни двух бинарных деревьев p и q, напишите функцию, проверяющую, совпадают ли они или нет.

Два бинарных дерева считаются одинаковыми, если они структурно идентичны, а узлы имеют одинаковое значение.

Input: p = [1,2,3], q = [1,2,3]
Output: true

Input: p = [1,2,1], q = [1,1,2]
Output: false
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if p is None and q is None:
            return True
        elif p is None or q is None:
            return False
        elif p.val != q.val:
            return False
        else:
            return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

Пояснение :-

Эта функция использует рекурсию, чтобы проверить, совпадают ли два заданных бинарных дерева. В базовом случае оба параметра p и q равны None, и в этом случае функция возвращает значение True. Если только одно из них равно None, функция возвращает False, так как они не совпадают. Если значения корней p и q не совпадают, функция также возвращает False. Если ни один из этих случаев не соответствует действительности, функция рекурсивно проверяет левое и правое поддеревья p и q. Если и левое, и правое поддеревья совпадают, функция возвращает True, в противном случае — False.

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

Какова его временная и пространственная сложность?

Временная сложность этой реализации равна O(n), где n – количество узлов в дереве. Это связано с тем, что каждый узел в дереве посещается ровно один раз. Пространственная сложность также равна O(n), потому что в худшем случае нам нужно сохранить n узлов в стеке вызовов во время рекурсии.

В случае реализации итерации временная сложность по-прежнему будет O(n), так как мы посещаем каждый узел один раз, а пространственная сложность будет равна O(min(n,m)), где n и m — количество узлов. в первом и втором дереве соответственно.

Стоит отметить, что если деревья не сбалансированы, временная сложность будет хуже, чем O (n), из-за количества вызовов рекурсии, которые будет выполнять алгоритм.

Кроме того, при очень глубоком дереве лучше использовать рекурсию, а не итерацию, поскольку рекурсия занимает меньше места в памяти для стека вызовов.

Вы проверяете мой репозиторий Github для других проблем здесь: -



Удачного кодирования :)