Рубрики
Без рубрики

Двоичная практика деревьев в Python: Зеркальное дерево

<< # 20 Шриток - первый поиск | Просмотр решения на Github | # 22 Сумма трех + >> (Изображение:… Теги с Python, начинающими, CodeNewie, информатики.

<< # 20 Шпировку – первый поиск |. Просмотр решения на GitHub |. # 22 Сумма трех + >>

(Изображение: дополнительная связь на Flickr)

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

Вот проблема из Лецкод Отказ

# Given the root of a binary tree, check whether it is 
# a mirror of itself (i.e., symmetric around its center).

Давайте посмотрим на некоторые примеры.

(Изображение: лецкод)

Отдавая функцию корня вышеуказанного дерева принесет Правда , поскольку значения в левой половине дерева отражают значения справа.

(Изображение: лецкод)

На вышеуказанном дереве узлы с 3 не организуются для зеркала друг друга. Прохождение корня принесет Ложь Отказ

1. Стратегия

Как и в случае с двоичными деревами, первое, что мы хотим спросить, – это если мы должны использовать Ширина – или первый поиск Отказ На первый взгляд, вы можете подумать, что BFS имеет смысл, увидев, что все узлы одинаковы на первых двух уровнях. Но как только мы посмотрим на третий уровень с узлами 3, 4, 4, 3 Внезапно он становится все сложнее. Вместо этого, если мы разделим дерево на две половины и запустили глубину – сначала поиск по каждой половине? Давайте снова посмотрим на первый пример:

Если бы мы посмотрели на левую половину, глубину первым обходом будут читать узлы в порядке: 2, 3, 4 Отказ В то же время мы можем путешествовать по правой стороне дерева и печатать одинаковую 2, 3, 4 Отказ Затем мы заключаем, что дерево симметрично.

2. Настраивать

Первое, что нам нужно, это наш Treenode класс. Как всегда, это займет данные , значение, которое мы хотим хранить на узле, а затем левый и правильно Указатель, которые инициализируются на Нет Отказ

class TreeNode:
  def __init__(self, data):
    self.data = data
    self.left = None
    self.right = None

Далее мы определяем наш метод, который принимает в одно значение: корневой узел дерева.

def is_mirror(root):
  pass

Помните, как мы сказали, мы разделили дерево на две половины, а затем проверьте узлы в каждой половине? Мы сделаем это, позвонив рекурсивным методом помощника, check_halves Отказ Этот метод берет левый и правый узел, который будет root.left и root.right начать.

def is_mirror(root):
  return check_halves(root.left, root.right)

3. Обход

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

def check_halves(left, right):

Каков наш базовый случай? Самый простой пример был бы деревом только с корневым узлом, чьи левые и правые половинки оба Нет Отказ В этом случае мы возвращаем Правда Отказ

def check_halves(left, right):
  if not left and not right:
    return True

Что дальше? Мы хотим проверить, что есть как левый, так и правый узел, и что их значения совпадают. Это можно поставить в то же самое, если заявление, но я отделим их для ясности.

def check_halves(left, right):
  if not left and not right:
    return True
  if left and right:
    if left.data == right.data:

Далее мы рекурсим! Здесь мы сделаем глубину первой обход на левой и правой половине дерева.

      left_half = check_halves(left.left, right.right) 
      right_half = check_halves(left.right, right.left)

Затем мы проверяем, есть ли они оба Правда Отказ Это может быть достигнуто с помощью и утверждение.

      return left_half and right_half

Наконец, мы вернем ложь, если предыдущий Если Состояние не было выполнено. В целом наш помощник методом выглядит так:

def check_halves(left, right):
  if not left and not right:
    return True
  if left and right:
    if left.data == right.data:
      left_half = check_halves(left.left, right.right) 
      right_half = check_halves(left.right, right.left)
      return left_half and right_half
  return False

4. Проверьте его

Следующий код будет построить дерево из примера.

tree1 = TreeNode(1)
tree1.left = TreeNode(2)
tree1.right = TreeNode(2)
tree1.left.left = TreeNode(3)
tree1.right.right = TreeNode(3)
tree1.left.right = TreeNode(4)
tree1.right.left = TreeNode(4)

Теперь нам просто нужно позвонить Печать (is_mirror (дерево1)) И это будет печатать Правда Отказ Успех!

Давайте попробуем дерево, которое не симметрично, как второй пример. Два узла со значением 3 не расположены, чтобы отражать друг друга.

tree2 = TreeNode(1)
tree2.left = TreeNode(2)
tree2.right = TreeNode(2)
tree2.left.left = TreeNode(3)
tree2.right.left = TreeNode(3)

Печать iS_mirror (дерево2) должен дать нам Ложь Отказ То же самое будет работать, если мы изменим какие-либо значения на первом дереве, чтобы они не совпадали влево и вправо.

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

<< # 20 Шпировку – первый поиск |. Просмотр решения на GitHub |. # 22 Сумма трех + >>

Sheamus Heikkila ранее преподавательский помощник на Генеральной Ассамблее. Этот блог не связан с GA.

Оригинал: “https://dev.to/pythonwb/binary-tree-practice-in-python-mirror-tree-1hl”