PassFront
  1. PassFront
  2. База знаний
  3. Деревья и кучи

Какие бывают обходы бинарного дерева: pre-order, in-order, post-order, level-order?

Деревья и кучи

Три обхода в глубину различаются моментом посещения корня: до поддеревьев (pre-order), между ними (in-order) или после (post-order); level-order — обход в ширину по уровням через очередь. Все четыре работают за O(n).

Когда какой

  • Pre-order (корень, левое, правое) — копирование и сериализация дерева, префиксная запись выражения.
  • In-order (левое, корень, правое) — для BST выдаёт ключи по возрастанию.
  • Post-order (левое, правое, корень) — сначала дети, потом родитель: удаление дерева, подсчёт высоты и размеров поддеревьев, вычисление дерева выражения.
  • Level-order — минимальная глубина, «вид справа», поуровневый вывод; память O(w), где w — максимальная ширина уровня.

Итеративный in-order

Рекурсия тратит O(h) стека, и на вырожденном дереве из 10⁵ узлов может переполнить его. Явный стек:

/** Узел: { val, left, right }, отсутствующий ребёнок — null */
function inorder(root) {
  const out = [];
  const stack = [];
  let cur = root;
  while (cur || stack.length) {
    while (cur) { stack.push(cur); cur = cur.left; }
    cur = stack.pop();
    out.push(cur.val);
    cur = cur.right;
  }
  return out;
}

Обход Морриса делает in-order за O(1) дополнительной памяти, временно перенаправляя правые указатели.

Коротко для собеседования

Обходы в глубину отличаются только моментом обработки корня: in-order для BST даёт сортировку, post-order нужен, когда родителю важны результаты детей, а level-order идёт по уровням через очередь. На глубоких деревьях рекурсию заменяют явным стеком, иначе легко получить переполнение стека.

Другие вопросы раздела