Обход N-чного дерева (N-ary Tree) в глубину

Дано n-ary tree, нужно написать preorder обход дерева в глубину.

Решение

В этой задачке будет много терминов. Предполагая, что они не сами собой разумеющиеся, я попробую их сперва описать.

Двоичное (бинарное) дерево — у каждого узла два ребёнка. Троичное — три, ну и N-чное — общий случай, когда количество детей любое.

N-ary Tree

N-ary Tree

Есть различные варианты обхода дерева в глубину: preorder, inorder, postorder.

В данной задаче требуется написать preorder, поэтому необходимо знать в чём отличия разных вариантов обхода.

preorder

Обычно работают с двоичными деревьями, тогда алгоритм описывается так:

  1. печатаем значение текущего узла
  2. идём рекурсивно в левое поддерево
  3. идём рекурсивно в правое поддерево

Т.к. у нас N детей в общем случае, то алгоритм немного меняется — идём рекурсивно слева направо во все поддеревья (сперва в левое, а потом в правое — частный случай).

На простом примере:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0e6d7a5b-1fe9-4719-b390-086892ca1acd/Untitled.png

Вернуть нужно [1,3,5,6,2,4].

Печатаем 1, идём в 3. Печатаем 3, идём в 5. Дальше некуда идти, стек рекурсивных вызовов начинает разматываться, возвращаемся в 3, идём в 6 (продолжаем рекурсивный обход детей слева направо), ну и т.д.