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

Morris Traversal Morris Pre Traversal дерева

Это часть моей серии, где я участвую в MeMo из лецкода. Если у вас есть лучшие решения или идеи, … с меткой Python, LeetCode, алгоритмы, начинающие.

Это часть моей серии, где я участвую в MeMo из лецкода. Если у вас есть лучшие решения или идеи, пожалуйста, оставьте комментарий!

Шаблон обхода дерева

Вот три шаблона для обхода дерева. Каждый Паттен имеет только один заказ.

  • Пересечение перед порядком
    • root -> слева -> Правильно
  • Обход в заказа
    • слева -> root -> право
  • Обход после заказа
    • Право -> Левый -> root

Проблема

Сегодняшняя проблема заключается в прохождении президентов.

Двоичный президент дерева обход

Учитывая двоичное дерево, верните превышение преобразования значений узлов. Пример: Вход: [1, NULL, 2,3] выход: [1,2,3]

Мы должны поставить значения ввода в предварительный заказ, что является root -> слева -> верно .

Подход

Чтобы решить проблему с обходом Morris, мы должны следовать четырем шагам ниже.

  1. Идите один шаг, если это возможно, а затем идите прямо до конца.
  2. Добавьте узел для вывода и установите ссылку предшественник .
  3. Когда мы посещаем тот же предшественник во второй раз, он уже указывает на текущий узел, поэтому мы удаляем ссылку, созданную на шаге2 и переместим на правый узел с Node.right Отказ
  4. вернуть шаг1.
  • Примечание. Если этап1 невозможен, добавьте узел для вывода и перемещения прямо на следующий узел.

Вот точки, которые вы должны помнить.

  • Добавьте выход, когда узел не имеет левого узла или предшественников. Ручево – это нулевой.
  • Когда предшественник не имеет правого узла, составьте ссылку из предшественника к узлу.
  • После изготовления ссылки от предшественника к узлу переместите узел влево.
  • После удаления ссылки из предшественника к узлу переместите узел вправо.

Вот пример обхода.

Решение: MORRIS Предварительный заказ Tree Traversal

class Solution:
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :type: List[int]
        """
        node = root
        output = []
        while node:
            if node.left is None:
                output.append(node.val)
                node = node.right
            else:                
                predecessor = node.left
                while predecessor.right and predecessor.right is not node:
                    predecessor = predecessor.right
                if predecessor.right is None:
                    output.append(node.val)
                    predecessor.right = node
                    node = node.left
                else:
                    predecessor.right = None
                    node = node.right
        return output

Спасибо за прочтение этой статьи! Я всегда приветствую ваши отзывы, вопрос и идею.

Оригинал: “https://dev.to/shoryu/morris-pre-order-tree-traversal-332b”