Это часть моей серии, где я участвую в 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”