Это часть моей серии, где я участвую в MeMo из лецкода. Если у вас есть лучшие решения или идеи, пожалуйста, оставьте комментарий!
Шаблон обхода дерева
Вот три шаблона для обхода дерева. Каждый Паттен имеет только один заказ.
- Пересечение перед порядком
- root -> слева -> Правильно
- Обход в заказа
- слева -> root -> право
- Обход после заказа
- Право -> Левый -> root
Проблема
Сегодняшняя проблема заключается в прохождении президентов.
Двоичный президент дерева обход
Учитывая двоичное дерево, верните превышение преобразования значений узлов. Пример: Вход: [1, NULL, 2,3] выход: [1,2,3]
Мы должны поставить значения ввода в предварительный заказ, что является root -> слева -> верно
.
Подход
Чтобы решить проблему с обходом Morris, мы должны следовать четырем шагам ниже.
- Идите один шаг, если это возможно, а затем идите прямо до конца.
- Добавьте узел для вывода и установите ссылку
предшественник
. - Когда мы посещаем тот же предшественник во второй раз, он уже указывает на текущий узел, поэтому мы удаляем ссылку, созданную на шаге2 и переместим на правый узел с
Node.right
Отказ - вернуть шаг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”