В двоичной максимальной куче, реализованной как двоичное дерево (где каждый узел хранит указатель на своего родителя, левого дочернего и правого дочерних элементов), если у вас есть указатель на корень кучи, как бы вы реализовали операцию вставки? Что должно произойти, так это то, что узел первым вставляется как последний элемент в последней строке. Для массива вы можете добавить его к массиву, но для реализации на основе дерева, как бы вы нашли нужное место?
Как вставить в двоичную максимальную кучу, реализованную в виде двоичного дерева?
Ответы (3)
В этом более старом вопросе я дал короткий алгоритм, использующий двоичный представление числа k, чтобы найти способ выбрать k -й узел из двоичной кучи при обходе сверху вниз. Предполагая, что вы отслеживаете количество узлов в явном древовидном представлении двоичной кучи, вы можете сделать следующее, чтобы выполнить операцию вставки:
- Используя приведенный выше алгоритм, определите, куда должен идти новый узел, а затем вставьте узел в эту позицию.
- Непрерывно перемещайте узел вверх, либо перенастраивая дерево, чтобы поменять его местами с его родителем, либо обмениваясь полями данных узла и его родителя, пока элемент не займет свое окончательное положение.
Надеюсь это поможет!
Если вы повесите новую вершину под любым листом вашего дерева (как левый или правый преемник, не имеет значения), а затем восстановите кучу от этой новой вершины до вершины (то есть, относительно каждой другой вершины с преемниками, поменяйте ее местами с большим преемником и, если нужно, поднимитесь вверх), ваш новый элемент найдет свое законное место, не разрушая кучу. Однако это будет гарантировать вам только то, что любая другая операция вставки займет время O (h), где h - максимальная высота дерева. Очевидно, что лучше представить кучу в виде массива, потому что таким образом гарантируется, что каждая операция вставки займет время O (logN).
Чтобы найти точное место, где должен быть вставлен новый узел, мы используем двоичное представление размера двоичной кучи. Это занимает O (log N), а затем мы всплываем, что занимает O (log N). Таким образом, операция вставки занимает O (log N) ... Для подробного объяснения ознакомьтесь с сообщением в моем блоге о двоичных кучах -
http://theoryofprogramming.com/2015/02/01/binary-heaps-and-heapsort-algorithm/
Надеюсь, это помогло вам, если это так, дайте мне знать ...! ☺