Найдите путь к каждому узлу дерева с помощью поиска в глубину, а затем вызовите enumerate-paths(Path p)
, где p
- путь от корня к узлу. Предположим, что путь p
- это массив узлов p[0] [1] .. p[n]
, где p[0]
- корень, а p[n]
- текущий узел.
enumerate-paths(p) {
for i = 0 .. n
output p[n - i] .. p[n] as a path.
}
Каждый из этих путей отличается, и каждый из них отличается от результатов, возвращаемых любым другим узлом дерева, поскольку никакие другие пути не заканчиваются на p[n]
. Ясно, что это завершено, так как любой путь от узла к некоторому узлу между ним и корнем. Он также является оптимальным, поскольку он находит и выводит каждый путь ровно один раз.
Порядок будет немного отличаться от вашего, но вы всегда можете создать массив списков путей, где A[x]
- это список путей длиной x
. Затем вы можете вывести пути в порядке их длины, хотя для этого потребуется O (n) памяти.