上一篇主要概述treap,并给出玩具版的代码。
这篇讲一讲treap树的插入、搜索、删除、旋转要考虑的问题。
先讲最需要注意的部分:结点旋转。
熟悉AVL树的会比较了解旋转,结点旋转是为了平衡树结构,使树更均匀。
那么treap树结点的旋转相对AVL简单,只有两种:左旋和右旋。
左旋就是:当根结点root的优先权低于root的右子结点时,需要将右子结点转到root位置,相应的root会变成新root的左子结点;
右旋同左旋类似。
图示:
插入:找到位置,插入叶子,查看新结点优先权与其父结点优先权大小关系,如果高,旋转至根结点;递归的进行如上操作。直至结点优先权低于其父结点为止。
删除:找到待删除结点,旋转至叶子结点。旋转方法为:取其优先权较高之孩子结点,将其旋转至父结点位置,这样父结点就下移,如此反复直到待删除结点没有任何孩子结点。然后删除。注意这里删除之后还要修改其父结点的子结点指针。
查找:跟BST一样。
全文完。