Распечатать дерево в отсортированном порядке с использованием свойств кучи (Кормен)

I Я освежаюсь по теории алгоритмов (от Кормена).
В главе есть упражнение для двоичных попыток, которое спрашивает:

Можно ли использовать свойство min-heap для распечатки ключей n-узлового дерева в отсортированном заказ в O (n) раз? Покажите, как это сделать, или объясните, почему нет.

Я думал, что да, это возможно.
В минимальной куче элемент в узле меньше, чем оба его дочерних элемента.
Таким образом, корень кучи всегда является меньшим элементом из всех n элементов, а левый дочерний элемент корня меньше всех элементов в левом поддереве, а правый дочерний элемент корня - меньший, чем все элементы в правом поддереве и т. д.

Итак, если мы продолжаем извлекать корень, печатать его, а затем обновлять корень меньшим из его дочерних элементов, мы сохраняем свойство min-heap и печатаем в отсортированном порядке.(Я думаю о минимальной куче, которая не основана на массиве).

Таким образом, это можно сделать за O (n) раз, поскольку для обновления корня мы просто сравниваем 2 дочерних элемента и обновляем указатель корня, чтобы он был меньшим из двух.

Но я проверил здесь в решении:
Cormen Supplement Solutions

И 1) он говорит о максимальных кучах 2) он говорит, что это не может быть выполнено за O (n) время:

В куче ключ узла - это оба его дочерних ключа . В двоичном дереве поиска ключ узла является ключом его левого дочернего элемента, но ключом правого дочернего элемента . Свойство heap, в отличие от свойства binary-searth-tree , не помогает распечатать узлы в отсортированном порядке, поскольку не сообщает, какое поддерево узла содержит элемент для печати { {1}} перед этим узлом. В куче самый большой элемент, меньший, чем узел , может находиться в любом поддереве. Обратите внимание, что если бы свойство кучи можно было бы использовать для печати ключей в отсортированном порядке за время O (n), у нас был бы алгоритм сортировки с временем O (n), потому что построение куча занимает всего O (n) раз. Но мы знаем (глава 8), что сортировка сравнения должна занимать (n lg n) времени.

С моей точки зрения, я могу понять, что с использованием максимальной кучи невозможно распечатать их за O (n).
Но разве невозможно сделать это с помощью свойства min-heap по рассуждениям, которые я объяснил?
Также, почему решение игнорирует min-heap. Это опечатка или ошибка?

Я что-то неправильно понимаю?

7
задан Cratylus 13 November 2011 в 10:03
поделиться