treap中的旋转是否可以违反其堆顺序或二进制搜索树顺序?

时间:2019-04-24 19:25:47

标签: c++ data-structures 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);
        }

我希望这些旋转不会违反堆的顺序和二分查找树的结构。

1 个答案:

答案 0 :(得分:0)

旋转会破坏堆排序,因为给定了根节点(X0,Y0),旋转后的子节点(X1,Y1)将成为根节点(X1,Y1)。由于根的Y值必须大于子项的Y值,因此我们知道最初Y0> Y1。旋转后,以Y1为根要求Y1> Y0,这是不正确的。

不过,二进制搜索树的属性不会被旋转破坏。