Давайте сначала подумаем о том, как работает BST. В любом данном узле, скажем, со значением x, все узлы в левом поддереве будут иметь значения x. Таким образом, чтобы вернуть отсортированный список поддерева, укорененного в узле x, вам просто нужно вернуть [отсортированный список левого поддерева] + [x] + [отсортированный список правого поддерева], поэтому вам просто нужно вызвать BSTtoList рекурсивно для левые и правые поддеревья, а затем верните список, описанный выше. Оттуда вам просто нужно обработать базовый случай возврата пустого списка на узле NULL.
Вышеприведенный алгоритм - время O (N ^ 2), и есть лучшее решение, использующее хвостовую рекурсию, которая выполняется в O (N) время, псевдокод, для которого:
def BSTtoList(root, accumulator):
if root == NULL:
return accumulator
else:
return BSTtoList(root.left_child, [root.value] + BSTtoList(root.right_child, accumulator)
Где BSTtoList первоначально вызывается с пустым списком в качестве аккумулятора. Это второе решение работает аналогично первому, но оптимизировано за счет минимизации слияния массивов (эта версия работает лучше всего, если в используемом языке есть вставка O (1) в начало списка; реализация немного отличается, если язык позволяет O (1) вставка в спину).