
Сегодня мы собираемся решить ту же задачу о деревьях, где вам даны два бинарных дерева, и мы должны сравнить их и посмотреть, идентичны ли они или нет.
Имея корни двух бинарных деревьев 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 для других проблем здесь: -
Удачного кодирования :)