Попробуйте, как я мог, я не уверен, что это возможно с двоичным деревом, у которого нет родительских указателей. O(1)
пробел означает, что вы не можете ни использовать рекурсию (рост стека O(log n)
), ни копировать в двусвязный список (O(n)
).
Метод, который вы намекаете на , является решением O(n)
сложности времени, но не с обычным двоичным деревом. На самом деле, я ответил на похожий вопрос очень подробно здесь . Это было решено с помощью O(n)
пробела, но только потому, что они изначально не были отсортированы.
Это возможно возможно с деревом, содержащим родительские указатели. Если дочерние узлы имеют указатели на своих родителей, вы можете рассматривать дерево как двусвязный список, обрабатываемый итеративно.
Для этого вы запускаете указатель начала вниз до самого левого узла, а указатель конца вниз до самого правого узла. Вы также поддерживаете две переменные для хранения последнего движения (вверх или поперек, первоначально вверх) каждого указателя, чтобы вы могли разумно выбрать следующее движение (front++
и end--
в вашем вопросе).
Затем вы можете использовать текущие указатели и последние движения, а также текущую сумму, чтобы решить, какой указатель двигаться (и как).