Вы не даете много, чтобы продолжить, но если требование такое, как я думаю, у вас есть двоичное дерево, уже созданное и хранящееся в памяти, но не отсортированное (так, как вы хотите, чтобы оно было отсортировано, в любом случае). ).
Я предполагаю, что узлы дерева выглядят как
struct tree_node {
struct tree_node * left;
struct tree_node * right;
data_t data;
};
Я также предполагаю, что вы можете прочитать C
Хотя мы могли бы просто сидеть и задаться вопросом, почему это дерево когда-либо было создано, если оно не было создано в отсортированном порядке, которое не приносит нам никакой пользы, поэтому я проигнорирую его и просто займусь сортировкой.
Требование, чтобы не использовалось дополнительное пространство, является странным. Временно будет дополнительное место, если только в стеке. Я собираюсь предположить, что это означает, что вызов malloc или что-то в этом роде, а также что результирующее дерево должно использовать не больше памяти, чем исходное несортированное дерево.
Первое и самое простое решение - выполнить предварительный обход несортированного дерева, удалив каждый узел из этого дерева и выполнив сортированную вставку в новое дерево. Это O (n + n log (n)), то есть O (n log (n)).
Если это не то, что они хотят, и вам придется использовать повороты и прочее ..... это ужасно!
Я думал, что вы могли бы сделать это, выполнив странную версию сортировки кучи, но я столкнулся с проблемами.
Еще одна вещь, которая пришла в голову, которая была бы ужасно медленной, это сделать странную версию пузырьковой сортировки на дереве.
Для этого каждый узел сравнивают и, возможно, меняют местами с каждым из его прямых потомков (и, следовательно, также с его родителем), пока вы не пройдете по дереву и не найдете
нужны свопы. Выполнение сортировки по шейкеру (пузырьковая сортировка, которая идет слева направо и справа налево) лучше всего подойдет, и после первоначального прохода вам не нужно будет проходить вниз по поддеревьям, которые выглядят не по порядку относительно своего родителя. .
Я уверен, что либо этот алгоритм был придуман кем-то еще до меня, и у него есть классное имя, которого я просто не знаю, либо что оно в некоторой степени ошибочно, и я его не вижу.
Приступить к расчетам времени выполнения для второго предложения довольно сложно. Сначала я подумал, что это будет просто O (n ^ 2), как пузыри и шейкеры, но я не могу убедить себя в том, что обход обхода поддерева может не выиграть достаточно, чтобы сделать его немного лучше, чем O (n ^ 2). По существу, сорта типа пузырьки и шейкеры тоже получают эту оптимизацию, но только на концах, где полная сортировка происходит рано, и вы можете сократить пределы. С этой версией дерева у вас есть возможность избежать кусков в середине набора. Ну, как я уже сказал, это, вероятно, смертельно опасно.