我不确定是否可以违反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);
}
我希望这些旋转不会违反堆的顺序和二分查找树的结构。
答案 0 :(得分:0)
旋转会破坏堆排序,因为给定了根节点(X0,Y0),旋转后的子节点(X1,Y1)将成为根节点(X1,Y1)。由于根的Y值必须大于子项的Y值,因此我们知道最初Y0> Y1。旋转后,以Y1为根要求Y1> Y0,这是不正确的。
不过,二进制搜索树的属性不会被旋转破坏。