«Это 22-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г.".
Описание темы
Имея бинарное дерево, проверьте, является ли оно зеркально симметричным.
Например, бинарное дерево[1,2,2,3,4,4,3]
является симметричным.
1
/ \
2 2
/ \ / \
3 4 4 3
Но следующее[1,2,2,null,3,null,3]
не является зеркально-симметричным:
1
/ \
2 2
\ \
3 3
Расширенный: вы можете использовать递归
и迭代
Есть ли два пути решения этой проблемы?
Идеи решения проблем
рекурсия
Симметричное дерево на самом деле является зеркальным отображением левого и правого поддеревьев, поэтому вы можете указать два указателя.l
, r
В то же время двигайтесь в противоположном направлении для обхода дерева, оба указателя начинают указывать на корневой узел, затем l 右移时,r 左移,l 左移时,r 右移
. Каждый раз, когда вы проверяете текущийl
иr
Равны ли значения узлов и симметричны ли левое и правое поддеревья.
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def search(l, r):
if not l and not r:
return True
if not l or not r:
return False
return l.val == r.val and search(l.left, r.right) and search(l.right, r.left)
return search(root, root)
- Временная сложность: O(n)
- Космическая сложность: O(n)
повторять
Введение очереди — распространенный метод рекурсивных --> итеративных преобразований.
При инициализации ставим корневой узелroot
Зачислен дважды.
Извлечение двух узлов за разp
, q
и сравните, равны ли их значения (каждые два последовательных узла в очереди должны быть равны), затем поставьтеp
, q
Левый и правый дочерние узлы узла нажаты相反
вставляются в очередь по порядку. Когда очередь пуста или из очереди взят непрерывный узелp
, q
Когда они не равны (дерево несимметрично), алгоритм завершается.
def isSymmetric(root):
"""
:type root: TreeNode
:rtype: bool
"""
if root is None:
return False
queue = [root, root]
while queue:
p = queue.pop()
q = queue.pop()
if not p and not q:
continue
if not p or not q or p.val != q.val:
return False
queue.append(p.left)
queue.append(q.right)
queue.append(p.right)
queue.append(q.left)
return True
- Временная сложность: O(n)
- Космическая сложность: O(n)
Сегодняшняя регистрация завершена, текущий прогресс — 10/200.
Это то, чем я хочу поделиться сегодня, поиск WeChatНовые горизонты Python, приносить вам больше полезных знаний каждый день.Организовано более тысячи наборов шаблонов резюме, и сотни электронных книг ждут, когда вы их соберете! Существует также группа обмена Python Xiaobai.Если вы заинтересованы, вы можете связаться со мной указанным выше способом!