Python реализует обход бинарного дерева в глубину и в ширину

интервью задняя часть Python алгоритм

Обзор

  • предисловие
  • что такое дерево
  • Что такое бинарное дерево
  • глубина первая
  • сначала в ширину
  • постскриптум

предисловие

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

что такое дерево

一棵树

В информатике,Дерево(английский: дерево) — это абстрактный тип данных (ADT) или структура данных, которая реализует этот абстрактный тип данных и используется для моделирования набора данных с древовидной структурой. Он состоит из n (n>0) конечных узлов, образующих набор с иерархическими отношениями.

особенности дерева

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

срок

  • Степень узла: количество поддеревьев, содержащихся в узле, называется степенью узла;
  • Степень дерева: В дереве степень наибольшего узла называется степенью дерева;
  • Листовые узлы или конечные узлы: узлы с нулевой степенью;
  • Нетерминальные узлы или узлы ветвления: узлы, степень которых не равна нулю;
  • Родительский узел или родительский узел: если узел содержит дочерние узлы, этот узел называется родительским узлом своих дочерних узлов;
  • Дочерний узел или дочерний узел: корневой узел поддерева, содержащегося в узле, называется дочерним узлом узла;
  • Братские узлы: узлы с одним и тем же родительским узлом называются родственными узлами;
  • Уровень узлов: начиная с определения корня, корень — это первый слой, дочерние узлы корня — это второй слой и так далее;
  • Глубина: для любого узла n глубина n — это длина уникального пути от корня к n, а глубина корня равна 0;
  • Высота: для любого узла n высота n — это длина самого длинного пути от n до листа, а высота всех листьев равна 0;
  • Двоюродный узел: узлы, чьи родительские узлы находятся в одном слое, являются двоюродными братьями друг друга;
  • Предки узла: все узлы на ветке от корня до узла;
  • Потомки: любой узел в поддереве с корнем в узле называется потомком узла.
  • Лес: совокупность m (m>=0) непересекающихся деревьев называется лесом;

Что такое бинарное дерево

бинарное дерево: дерево с не более чем двумя поддеревьями на узел называется бинарным деревом;полное бинарное дерево: Для бинарного дерева предполагается, что его глубина равна d (d>1). За исключением d-го слоя, количество узлов в других слоях достигло максимального значения, а все узлы d-го слоя тесно расположены непрерывно слева направо, такое бинарное дерево называется полным бинарным деревом ;

完全二叉树

полное бинарное дерево: полное бинарное дерево со всеми листовыми узлами внизу;

满二叉树

глубина первая

Обход в глубину заключается в том, чтобы сначала пройти по бинарному дереву по глубине, в том числе:

обход предварительного заказа
Порядок обхода -> корневой узел -> левое поддерево -> правое поддерево

Неупорядоченный обход
Порядок обхода -> левое поддерево -> корневой узел -> правое поддерево

пост-порядковый обход
Порядок обхода --> левое поддерево -> правое поддерево -> корневой узел

Сначала определите TreeNode:

class TreeNode:
    def __init__(self, value=None, left=None, right=None):
        self.value = value
        self.left = left  # 左子树
        self.right = right  # 右子树

Создайте экземпляр TreeNode:

node1 = TreeNode("A",
                 TreeNode("B",
                          TreeNode("D"),
                          TreeNode("E")
                          ),
                 TreeNode("C",
                          TreeNode("F"),
                          TreeNode("G")
                          )
                 )

обход предварительного заказа

def preTraverse(root):
    if root is None:
        return
    print(root.value)
    preTraverse(root.left)
    preTraverse(root.right)

результат операции:

A
B
D
E
C
F
G

Неупорядоченный обход

def midTraverse(root):
    if root is None:
        return
    midTraverse(root.left)
    print(root.value)
    midTraverse(root.right)

результат операции:

D
B
E
A
F
C
G

пост-порядковый обход

def afterTraverse(root):
    if root is None:
        return
    afterTraverse(root.left)
    afterTraverse(root.right)
    print(root.value)

результат операции:

D
E
B
F
G
C
A

сначала в ширину

Обход в ширину — это иерархический обход, который выполняется слой за слоем.

def levelOrder(root):
    # write your code here
    res = []
    # 如果根节点为空,则返回空列表
    if root is None:
        return res
    # 模拟一个队列储存节点
    q = []
    # 首先将根节点入队
    q.append(root)
    # 列表为空时,循环终止
    while len(q) != 0:
        length = len(q)
        for i in range(length):
            # 将同层节点依次出队
            r = q.pop(0)
            if r.left is not None:
                # 非空左孩子入队
                q.append(r.left)
            if r.right is not None:
                # 非空右孩子入队
                q.append(r.right)
            res.append(r.value)
            print(r.value)
    return res

результат операции:

A
B
C
D
E
F
G

постскриптум

Этот обзор здесь первый. Давайте ныть здесь, структура данных и расчет очень важны. Реализация многих вещей необходима для структуры данных и алгоритма. Например, реализация mysql использует дерево B +. Если мы поймем принцип, это значительно улучшит производительность базы данных. Помогите . Еще одним важным моментом является то, что алгоритмы и структуры данных определенно незаменимы для собеседований на крупных фабриках. Хотите попасть на большой завод? Или послушно выучить алгоритм.

Эта статья была впервые опубликована в общедоступной учетной записи «zone7». Подпишитесь на общедоступную учетную запись, чтобы получать последние твиты, и отвечайте на [Индекс национального дня] в фоновом режиме, чтобы получить исходный код.