Я согласен с ответом Томаса Але, если вы хотите составить все списки строк одновременно. Похоже, вы заинтересованы в создании списка только для одной конкретной строки.
Допустим, у вас есть гигантское дерево, но вы хотите связать только 5-й ряд. Очевидно, что нет никакого смысла в доступе к любому узлу ниже 5-го ряда. Так что просто сделайте DFS с досрочным прекращением. К сожалению, вам все еще нужно пройти через всех предков каждого узла в списке.
Но вот хорошие новости. Если у вас есть идеальное двоичное дерево (где каждый отдельный узел разветвляется ровно дважды, кроме последней строки), то в первой строке будет 1 один, второй 2, третий 4, четвертый 8 и пятый 16. Таким образом, есть еще узлов в последнем ряду (16), чем все предыдущие вместе взятые (1 + 2 + 4 + 8 = 15), поэтому поиск по всем предкам по-прежнему просто O (n), где n - количество узлов в строки.
С другой стороны, в худшем случае пятая строка состоит из одного узла с полным двоичным деревом над ним. Тогда вам все равно придется поискать всех 15 предков, чтобы поместить этот один узел в список.
Таким образом, хотя этот алгоритм действительно является вашим единственным выбором без изменения структуры данных, его эффективность полностью зависит от того, насколько заполненная строка сравнивается с более высокими строками.