#c #data-structures #treap
#c #структуры данных #treap
Вопрос:
Я не уверен, могу ли я нарушать порядок кучи treap или это структура, подобная двоичному дереву поиска, с методами поворота влево и / или вправо.
Это код для поворота влево
typename BinarySearchTree<K, T>::BSTTreeNode* rightSon = (*node).getRightSon();
if (rightSon != nullptr)
{
typename BinarySearchTree<K,T>::BSTTreeNode* leftGreatSon = (*rightSon).getLeftSon();
(*node).setRightSon(leftGreatSon);
(*rightSon).setLeftSon(node);
}
и поворот вправо
typename BinarySearchTree<K,T>::BSTTreeNode* leftSon = (*node).getleftSon();
if (leftSon != nullptr)
{
typename BinarySearchTree<K,T>::BSTTreeNode* rightGreatSon = (*leftSon).getRightSon();
(*leftSon).setRightSon(node);
(*node).setLeftSon(parent);
}
Я бы ожидал, что эти вращения не будут нарушать порядок кучи и структуру, подобную бинарному дереву поиска treap.
Комментарии:
1. просто любопытно; Почему вы делаете
(*node).getRightSon()
вместоnode->getRightSon()
?2. @Leonid проект предоставлен school, и Intellisense по какой-то причине в нем не работает. Проще ввести (* node).getRightSon(), чем node->getRightSon()
Ответ №1:
Порядок кучи будет уничтожен вращением, поскольку задан корневой узел (X0, Y0), дочерний узел (X1, Y1) которого после вращения (X1, Y1) будет корневым. Поскольку значение Y корня должно быть больше значения дочернего элемента, мы знаем, что изначально Y0 > Y1. После поворота Y1, являющийся root, требует, чтобы Y1 > Y0, что неверно.
Однако свойства двоичного дерева поиска не уничтожаются вращением.