# coding=utf-8
# treap(树堆)Python实现 import random def preorder_tree_walk(node):
if node:
print node.key, node.priority
preorder_tree_walk(node.left)
preorder_tree_walk(node.right) def left_rotate(tree, node):
node_right = node.right
if not node.p:
tree.root = node_right
elif node == node.p.left:
node.p.left = node_right
else:
node.p.right = node_right
node_right.p = node.p
node.right = node_right.left
if node_right.left:
node_right.left.p = node
node_right.left = node
node.p = node_right def right_rotate(tree, node):
node_left = node.left
if not node.p:
tree.root = node_left
elif node == node.p.left:
node.p.left = node_left
else:
node.p.right = node_left
node_left.p = node.p
node.left = node_left.right
if node_left.right:
node_left.right.p = node
node_left.right = node
node.p = node_left class TreapNode(object):
def __init__(self, key, priority):
self.key = key
self.priority = priority
self.left = None
self.right = None
self.p = None class Treap(object):
def __init__(self):
self.root = None def find(self, key):
temp_root = self.root
while temp_root:
if key < temp_root.key:
temp_root = temp_root.left
elif key > temp_root.key:
temp_root = temp_root.right
else:
return temp_root
return None def insert(self, node):
temp_root = self.root
temp_node = None
while temp_root:
temp_node = temp_root
if node.key > temp_node.key:
temp_root = temp_root.right
elif node.key < temp_node.key:
temp_root = temp_root.left
else:
raise KeyError, "Error"
if not temp_node:
self.root = node
return
elif node.key < temp_node.key:
temp_node.left = node
node.p = temp_node
elif node.key > temp_node.key:
temp_node.right = node
node.p = temp_node
self.fixup(temp_node, node) def fixup(self, father, child):
if father:
if child == father.left and child.priority < father.priority:
right_rotate(self, father)
elif child == father.right and child.priority < father.priority:
left_rotate(self, father)
self.fixup(father.p, father) def delete(self, key):
node = self.root
while node:
if key < node.key:
node = node.left
elif key > node.key:
node = node.right
else:
break
if not node:
raise KeyError, "Error!"
flag = 1
while flag:
if not node.left:
if node.right:
node.right.p = node.p
if node.p:
if node == node.p.left:
node.p.left = node.right
else:
node.p.right = node.right
else:
self.root = node.right
flag = 0
elif not node.right:
if node.left:
node.left.p = node.p
if node.p:
if node == node.p.left:
node.p.left = node.left
else:
node.p.right = node.left
else:
self.root = node.left
flag = 0
else:
# 如果左右子节点均存在 那么把 priority 值大的放到根节点的位置上 网上给的是递归实现 那有没有可能可以递推实现呢?
# 答案是 有可能的
if node.left.priority < node.right.priority:
right_rotate(self, node)
else:
left_rotate(self, node) def main():
number_list = (7, 4, 1, 8, 5, 2, 9, 6, 3)
tree = Treap()
for number in number_list:
priority = random.randint(1, 100)
node = TreapNode(number, priority)
tree.insert(node)
preorder_tree_walk(tree.root)
print '=========='
tree.delete(4)
preorder_tree_walk(tree.root) if __name__ == '__main__':
main()
网上一些资料都是递归实现的插入和删除, Python由于没有按引用传递, 所以暂时没有想到好的办法来递归实现, 只好递推实现。
注:暂时没有时间写实现思路,等过一段时间补上
End.

最新文章

  1. WP8 MediaElement 实现循环播放
  2. JS时间戳格式化日期时间 由于mysql数据库里面存储时间存的是时间戳,取出来之后,JS要格式化一下显示。
  3. SQL书写技巧
  4. “微信应用号对行业影响”之一,app开发速来围观
  5. 页面爬虫(获取其他页面HTML)加载到自己页面
  6. Android游戏开发之旅 View类详解
  7. 【Idea】好的插件集合,持续更新
  8. https进行配置以及http跳转到https配置
  9. Jekyll博客添加Valine评论
  10. Zookeeper学习笔记4
  11. 【Tensorflow】Tensorflow r1.0, Ubuntu, gpu, conda安装说明
  12. JS关键字和保留字汇总(小记)
  13. 【BZOJ3129】[SDOI2013]方程(容斥,拓展卢卡斯定理)
  14. bzoj3277 串 (后缀数组+二分答案+ST表)
  15. java Filter过滤器例外URL设置
  16. Cassandra V2.1.20单机安装
  17. SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
  18. 测试TextKit渲染大文本的效率
  19. css中设置background属性
  20. js的作用域深入理解

热门文章

  1. 第三篇 makefile的伪目标
  2. [Data Structure] Linked List Implementation in Python
  3. Loj 2536 解锁屏幕
  4. 《DSP using MATLAB》Problem 4.20
  5. 网络流--最大流ek模板
  6. 关联容器set的用法(关联容器,红黑树,)
  7. Open-sourcing sso, the way we secure services at BuzzFeed
  8. 【转】每天一个linux命令(28):tar命令
  9. hadoop之 Yarn 调度器Scheduler详解
  10. django admin model使用技巧