全球旧事资料 分类
tbrightbrightaab
代码7
2遍历和查找
f像大多是平衡树一样,在Treap中查找和遍历不会改变Treap的结构。所以在Treap中查找和遍历的方法,与基本的二叉查找树完全相同。具体方法参见二12和二13。
4
3插入
在Treap中插入元素,与在BST中插入方法相似。首先找到合适的插入位置,然后建立新的节点,存储元素。但是要注意建立新的节点的过程中,会随机地生成一个修正值,这个值可能会破坏堆序,因此我们要根据需要进行恰当的旋转。具体方法如下:
12
从根节点开始插入;如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入,插入后如果左子节点的修正值小于当前节点的修正值,对当前节点进行右旋;如果要插入的值大于当前节点的值,在当前节点的右子树中插入,插入后如果右子节点的修正值小于当前节点的修正值,对当前节点进行左旋;如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空,插入成功。
3
4
5
举例说明,如图8,在已知的Treap中插入值为4的元素。找到插入的位置后,随机生成的修正值为15。18
1
10
2
20
5
30
3
40
6
插入418
1
10
2
20
5
40
6
300
3
f15
4
图SEQ图ARABIC8
新建的节点4与他的父节点3之间不满足堆序,对以节点3为根的子树左旋,如图9。18
1
10
2
20
5
40
6
300
3
15
4
左旋318
1
10
2
20
5
40
6
15
4
30
3
图SEQ图ARABIC9
节点4与其父节点5仍不满足最小堆序,对以节点5为根的子树右旋,如图10。18
1
10
2
20
5
40
6
15
4
30
f3
右旋518
1
10
2
40
6
30
3
15
4
20
5
图SEQ图ARABIC10
至此,节点4与其父亲2满足堆序,调整结束。在Treap中插入元素的期望时间是OlogN。代码8为在Treap中插入一个值为7的元素的代码。Treap_NoderootvoidTreap_I
sertTreap_NodePi
tvalue节点指针一定要传递引用节点指针一定要传递引用ifP找到位置建立节点找到位置,找到位置,P
ewTreap_NodePvaluevaluePfixra
d生成随机的修正值生成随机的修正值elseifvaluePvalueTreap_I
sertPleftrifPleftfixPfixTreap_Right_RotateP左子节点修正值小于当前节点修正值右旋当前节点左子节点修正值小于当前节点修正值,左子节点修正值小于当前节点修正值,elseTreap_I
sertPrightrifPrightfixPfixTreap_Left_RotateP右子节点修正值小于当前节点修正值左旋当前节点右子节点修正值小于当前节点修正值,右子节点修正值小于当前节点修正值,
fi
tmai
Treap_I
sertroot7在Treap中插入值为的元素中插入值为7在rr
好听全球资料 返回顶部