Обходы дерева

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

Вариант
P16 Обходы дереваСимметричный · 1×

Пример задачи: вывести значения двоичного дерева поиска (BST) по возрастанию. Каждый узел — объект с полями val, left и right; всё в левом поддереве меньше узла, всё в правом — больше.

nonenonenonenonenonenone84121014out—стек вызововвершина справа8
ещё не посещёнждёт в стеке вызововтекущий вызовпройден, #n — его место в outnone: пустой потомок

8 — узел, а не none: обходим его

node = 8out = []
01/37
сначала · назад · пуск · шаг
Скорость
1function inorder(node, out):
2 if node is none:
3 return
4 inorder(node.left, out)
5 out.add(node.val)
6 inorder(node.right, out)

← → шаг · пробел — пауза

Как узнать

задача на дереве, где важен порядок, в котором встречаются узлы: значения по возрастанию или k-й наименьший в BST (симметричный), копирование или сохранение дерева (прямой), размеры, высоты и удаление (обратный).

Как решать такие задачи

  1. Выбери порядок по тому, когда узлу нужна своя работа: до потомков (прямой), между ними (симметричный) или после них (обратный).
  2. Напиши f(node). Если node — none, просто вернись.
  3. Поставь работу самого узла до, между или после вызовов f(node.left) и f(node.right).
  4. В BST симметричный обход выдаёт значения по возрастанию: так находят k-й наименьший, проверяют, что дерево — BST, и сравнивают соседей.

Где встречается

  • Удаление папки. rm -r не может удалить папку, пока в ней что-то есть, поэтому сначала удаляет содержимое, а папку — после. Это обратный обход.
  • Веб-страницы. document.querySelectorAll возвращает элементы в порядке документа: сначала элемент, потом его дети по очереди. Это прямой обход дерева HTML.
  • Компиляторы. Чтобы посчитать (2 + 3) × 4, сначала нужны оба операнда, потом операция, поэтому дерево выражения обходят обратным обходом. Байт-код Python так и выглядит: сначала загрузить операнды, потом операция.