Попробуйте, как я мог, я m не уверен, что это возможно с двоичным деревом, у которого нет родительских указателей. O(1)
пространство означает, что вы не можете использовать рекурсию (рост стека равен O(log n)
), а также копирование в двусвязный список (O(n)
).
Метод, который вы ссылаетесь на , является a O(n)
решение по временной сложности, но не с обычным двоичным деревом. Фактически, я очень подробно ответил на аналогичный вопрос here. Это было разрешено с помощью O(n)
, но только потому, что они не были первоначально отсортированы.
Это is Возможно с деревом, содержащим указатели родителей. Если дочерние узлы имеют указатели на своих родителей, вы можете в основном обрабатывать дерево как дважды связанный список, обработанный итеративно.
Для этого вы запускаете указатель начала вниз до самого левого узла, а конечный указатель - до самого верхнего узла. Вы также сохраняете две переменные, чтобы сохранить последнее движение (вверх или поперек, изначально вверх) каждого указателя, чтобы вы могли разумно выбрать следующий ход (front++
и end--
в своем вопросе).
Затем вы можете использовать текущие указатели и последние движения вместе с текущей суммой, чтобы определить, какой указатель перемещать (и как).
Это домашнее задание? (Обычно полезно упомянуть.) – ShreevatsaR
- все ли цифры положительные? можем ли мы предположить, что существует действительная пара чисел? если S - 8 и 4 - в дереве, можем ли мы дать 4 в качестве ответа? –
@SR Нет, это не домашнее задание. Просто любопытно. – Geek