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

(Двоичные) елки! Узнайте три простейших обхода дерева в Python

<< Неделя 14: Случайное число | Просмотр решения на GitHub | Неделя 16: Найти подстроки ... Tagged с Python, Computerscience, CodeNewie, начинающими.

<< Неделя 14: Случайное число |. Просмотр решения на GitHub |. Неделя 16: Найти подстроки >>

Кто-то на R/ProgrammingJokes думал, что они действительно умны. (Изображение: Reddit)

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

Мы не будем информировать бинарное дерево сегодня (* phew *), но мы посмотрим на пару обходных методов, и вы обнаружите, что двоичные деревья не слишком ужасно сложны, чтобы настроить.

Что такое бинарное дерево, в любом случае?

Вы можете запомнить связанные списки, когда мы накрыли их в предыдущей статье. Каждый список состоит из серии узлов, указывающих на другие узлы. Но что, если узел может указывать на более одного узла? Деревья именно то, где каждый родительский узел может иметь несколько детей. Мы называем его двоичным деревом, если максимальное количество детей составляет 2: левый и правый узел дочернего ребенка.

(Изображение: GeeksForGeeks)

В приведенном выше примере «корня», означающий самый верхний узел, имеет значение 1, а его дети являются узлами 2 и 3 и так далее. Узлы 3, 4 и 5 могут быть называться «листьями», потому что у них нет дочерних узлов.

Как бы мы пошли о создании дерева в Python? Он будет выглядеть похожим на наш связанный класс узла списка. Мы назовем это Treenode Отказ

class TreeNode:
    pass

Далее давайте определим __init __ () метод. Как всегда, это берет в Я И мы также пройдем в ценности, который нужно хранить на узле.

class TreeNode:
  def __init__(self, value):

Мы установим значение узла, и тогда мы определим левый и правый указатель, который мы установим как Нет начать.

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

И это все! Что, ты думал, что дерево будет сложнее? Для бинарного дерева единственное отличие от связанного списка в том, что вместо Следующий у нас есть левый и правильно Отказ

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

tree = TreeNode(1)
tree.left = TreeNode(2)
tree.right = TreeNode(3)
tree.left.left = TreeNode(4)
tree.left.right = TreeNode(5)

Пересекающий дерево

Итак, вы построили дерево, и теперь вы спрашиваете: «Как я вижу дерево, которое я только что построил? «Вы не можете просто распечатать все дерево в одной команде, но мы можем пройти через каждый узел. Но что в каком порядке мы должны распечатать каждый узел?

Три простых обхода для реализации – Предварительный заказ , Пост порядка и По порядку Отказ Вы также услышите термины ширина – первый и первый поиск, но реализация их сложнее, поэтому мы охватим их в будущей статье. Так каковы три перечислены выше? Давайте посмотрим на наше дерево снова.

(Изображение: GeeksForGeeks)

Предварительный заказ посещает родительский узел перед его детьми. Предварительный заказ вышеуказанного дерева приведет к 1, 2, 4, 5, 3.

Пост порядка сначала посещает детей узла, а затем родитель. После порядка приведет к 4, 5, 2, 3, 1.

По порядку посещает каждый узел слева направо. Обход в заказах вышеуказанного дерева даст нам 4, 2, 5, 1, 3

Давайте напишем методы обхода для нашего бинарного дерева. Начните с определения pre_order () Метод, который может выходить на улицу Treenode класс. Наш метод принимает один аргумент, самый высокий родитель, a.k.a. корневой узел.

def pre_order(node):
    pass

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

def pre_order(node):
  if node:
    pass

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

# prints the parent before each child
def pre_order(node):
  if node:
    print(node.value)
    pre_order(node.left)
    pre_order(node.right)

Просто, верно? Вы можете проверить это с деревом, который мы построили ранее.

pre_order(tree)

И результаты:

1
2
4
5
3

Отлично. Далее давайте поступим пост порядка. Вы можете подумать, что мы должны написать совершенно новый метод, но на самом деле, нам просто нужно изменить одну строку. Вместо того, чтобы «посещать» узел, а затем «пересекать» дети, мы просто «проезжаем» детей первым, а затем «посетите» родительский узел. Что я имею в виду под этим? Просто переместите оператор печати на последнюю строку! Не забудьте изменить имя всех ваших звонков в post_order () Отказ

# prints children and then parent
def post_order(node):
  if node:
    post_order(node.left)
    post_order(node.right)
    print(node.value)

Печать Результат должен дать нам следующее:

4
5
2
3
1

Где каждый детский узел посещается перед его родителем.

Последнее, нам нужно написать обход в порядке. Как вы проходите левый узел, а затем посетите родителя, а затем перейти вправо? Опять же, мы просто перемещаем оператор печати!

# prints left child, parent, then right child
def in_order(node):
  if node:
    in_order(node.left)
    print(node.value)
    in_order(node.right)

Теперь, если мы распечатаем дерево, узлы напечатаны «в порядке».

4
2
5
1
3

И там у вас есть, три простейших способа пройти двоичное дерево. Счастливого праздника, однако вы праздновать (социально дистанцирован конечно). Я надеюсь, что это помогло вам узнать больше о двоичных деревьях!

<< Неделя 14: Случайное число |. Просмотр решения на GitHub |. Неделя 16: Найти подстроки >>

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

Оригинал: “https://dev.to/pythonwb/binary-christmas-trees-learn-the-three-simplest-tree-traversals-in-python-41ch”