Двоичные деревья – это увлекательные структуры данных, которые предлагают целый ряд методов обхода для исследования своих узлов. Одним из таких интригующих методов обхода является обход порядка зигзагообразных уровней. В этой статье блога мы углубимся в концепцию обхода зигзагообразного уровня, обсудим ее значение и рассмотрим несколько методов ее реализации. Итак, давайте отправимся в это путешествие, чтобы разгадать скрытые закономерности в двоичных деревьях!
Понимание порядка обхода зигзагообразных уровней:
Обход зигзагообразного порядка уровней — это уникальный способ обхода двоичного дерева, при котором каждый уровень проходится поочередно слева направо и справа налево. В результате этого шаблона обхода получается зигзагообразный узор, напоминающий форму молнии. Следуя этому шаблону, мы можем исследовать узлы двоичного дерева в другом порядке по сравнению с традиционными методами обхода, такими как поиск в ширину (BFS) или поиск в глубину (DFS).
Метод 1: использование двух стеков
Одним из популярных подходов к реализации обхода зигзагообразных уровней является использование двух стеков. Мы можем поддерживать один стек для прохождения текущего уровня слева направо и другой стек для перемещения следующего уровня справа налево. Этот подход с чередующимся стеком позволяет нам легко добиться зигзагообразного узора. Давайте посмотрим на фрагмент кода ниже:
# Binary tree node definition
class Node:
def __init__(self, value):
self.data = value
self.left = None
self.right = None
# Zigzag Level Order Traversal using two stacks
def zigzag_level_order(root):
if not root:
return []
result = []
current_level = []
next_level = []
left_to_right = True
current_level.append(root)
while current_level:
current_node = current_level.pop()
result.append(current_node.data)
if left_to_right:
if current_node.left:
next_level.append(current_node.left)
if current_node.right:
next_level.append(current_node.right)
else:
if current_node.right:
next_level.append(current_node.right)
if current_node.left:
next_level.append(current_node.left)
if not current_level:
left_to_right = not left_to_right
current_level, next_level = next_level, current_level
return result
Метод 2: использование двухсторонней очереди
Другой подход к достижению зигзагообразного обхода порядка уровней — использование двусторонней очереди, также известной как двухсторонняя очередь. Дек позволяет нам эффективно вставлять и удалять элементы с обоих концов. Мы можем использовать это свойство для чередования перемещения слева направо и справа налево на каждом уровне. Вот пример фрагмента кода:
from collections import deque
# Zigzag Level Order Traversal using a deque
def zigzag_level_order(root):
if not root:
return []
result = []
current_level = deque()
current_level.append(root)
left_to_right = True
while current_level:
level_size = len(current_level)
level_nodes = []
for _ in range(level_size):
current_node = current_level.popleft()
level_nodes.append(current_node.data)
if current_node.left:
current_level.append(current_node.left)
if current_node.right:
current_level.append(current_node.right)
if not left_to_right:
level_nodes.reverse()
result.extend(level_nodes)
left_to_right = not left_to_right
return result
Обход зигзагообразного уровня предлагает увлекательный способ исследования узлов двоичного дерева. Используя либо подход на основе стека, либо подход на основе деков, мы можем легко перемещаться по дереву зигзагообразным образом. Эти методы демонстрируют универсальность бинарных деревьев и многочисленные способы манипулирования и исследования их структур. Итак, примите зигзаг и раскройте скрытые закономерности в двоичных деревьях!