1. # coding=utf-8
  2. # treap(树堆)Python实现
  3.  
  4. import random
  5.  
  6. def preorder_tree_walk(node):
  7. if node:
  8. print node.key, node.priority
  9. preorder_tree_walk(node.left)
  10. preorder_tree_walk(node.right)
  11.  
  12. def left_rotate(tree, node):
  13. node_right = node.right
  14. if not node.p:
  15. tree.root = node_right
  16. elif node == node.p.left:
  17. node.p.left = node_right
  18. else:
  19. node.p.right = node_right
  20. node_right.p = node.p
  21. node.right = node_right.left
  22. if node_right.left:
  23. node_right.left.p = node
  24. node_right.left = node
  25. node.p = node_right
  26.  
  27. def right_rotate(tree, node):
  28. node_left = node.left
  29. if not node.p:
  30. tree.root = node_left
  31. elif node == node.p.left:
  32. node.p.left = node_left
  33. else:
  34. node.p.right = node_left
  35. node_left.p = node.p
  36. node.left = node_left.right
  37. if node_left.right:
  38. node_left.right.p = node
  39. node_left.right = node
  40. node.p = node_left
  41.  
  42. class TreapNode(object):
  43. def __init__(self, key, priority):
  44. self.key = key
  45. self.priority = priority
  46. self.left = None
  47. self.right = None
  48. self.p = None
  49.  
  50. class Treap(object):
  51. def __init__(self):
  52. self.root = None
  53.  
  54. def find(self, key):
  55. temp_root = self.root
  56. while temp_root:
  57. if key < temp_root.key:
  58. temp_root = temp_root.left
  59. elif key > temp_root.key:
  60. temp_root = temp_root.right
  61. else:
  62. return temp_root
  63. return None
  64.  
  65. def insert(self, node):
  66. temp_root = self.root
  67. temp_node = None
  68. while temp_root:
  69. temp_node = temp_root
  70. if node.key > temp_node.key:
  71. temp_root = temp_root.right
  72. elif node.key < temp_node.key:
  73. temp_root = temp_root.left
  74. else:
  75. raise KeyError, "Error"
  76. if not temp_node:
  77. self.root = node
  78. return
  79. elif node.key < temp_node.key:
  80. temp_node.left = node
  81. node.p = temp_node
  82. elif node.key > temp_node.key:
  83. temp_node.right = node
  84. node.p = temp_node
  85. self.fixup(temp_node, node)
  86.  
  87. def fixup(self, father, child):
  88. if father:
  89. if child == father.left and child.priority < father.priority:
  90. right_rotate(self, father)
  91. elif child == father.right and child.priority < father.priority:
  92. left_rotate(self, father)
  93. self.fixup(father.p, father)
  94.  
  95. def delete(self, key):
  96. node = self.root
  97. while node:
  98. if key < node.key:
  99. node = node.left
  100. elif key > node.key:
  101. node = node.right
  102. else:
  103. break
  104. if not node:
  105. raise KeyError, "Error!"
  106. flag = 1
  107. while flag:
  108. if not node.left:
  109. if node.right:
  110. node.right.p = node.p
  111. if node.p:
  112. if node == node.p.left:
  113. node.p.left = node.right
  114. else:
  115. node.p.right = node.right
  116. else:
  117. self.root = node.right
  118. flag = 0
  119. elif not node.right:
  120. if node.left:
  121. node.left.p = node.p
  122. if node.p:
  123. if node == node.p.left:
  124. node.p.left = node.left
  125. else:
  126. node.p.right = node.left
  127. else:
  128. self.root = node.left
  129. flag = 0
  130. else:
  131. # 如果左右子节点均存在 那么把 priority 值大的放到根节点的位置上 网上给的是递归实现 那有没有可能可以递推实现呢?
  132. # 答案是 有可能的
  133. if node.left.priority < node.right.priority:
  134. right_rotate(self, node)
  135. else:
  136. left_rotate(self, node)
  137.  
  138. def main():
  139. number_list = (7, 4, 1, 8, 5, 2, 9, 6, 3)
  140. tree = Treap()
  141. for number in number_list:
  142. priority = random.randint(1, 100)
  143. node = TreapNode(number, priority)
  144. tree.insert(node)
  145. preorder_tree_walk(tree.root)
  146. print '=========='
  147. tree.delete(4)
  148. preorder_tree_walk(tree.root)
  149.  
  150. if __name__ == '__main__':
  151. main()
  1. 网上一些资料都是递归实现的插入和删除, Python由于没有按引用传递, 所以暂时没有想到好的办法来递归实现, 只好递推实现。
    注:暂时没有时间写实现思路,等过一段时间补上
    End.

treap Python实现的更多相关文章

  1. 【Python】 sort、sorted高级排序技巧

    文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...

  2. python 列表排序方法sort、sorted技巧篇

    Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...

  3. python sort、sorted高级排序技巧(转)

    add by zhj: 没找到原文.可以按多个维度进行排序,而且可以指定他们的排序方向,如果维度都是数字,排序比较容易,用+/-号就可以 指定排序方向.否则,就调用多次sorted进行排序了,而且要按 ...

  4. 【转载】 python sort、sorted高级排序技巧

    这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Python list内置so ...

  5. python总结六

    1.python中主要存在四种命名方式: object #公用方法 _object #半保护                  #被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些 ...

  6. Treap——堆和二叉树的完美结合,性价比极值的搜索树

    大家好,今天和大家聊一个新的数据结构,叫做Treap. Treap本质上也是一颗BST(平衡二叉搜索树),和我们之前介绍的SBT是一样的.但是Treap维持平衡的方法和SBT不太一样,有些许区别,相比 ...

  7. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  8. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  9. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

随机推荐

  1. 安装wordcloud第三方库Unable to find vcvarsall.bat

    前言 本来想要使用python爬一些数据的,制作词云,感觉挺好玩的,不过python安装第三方库的时候遇到了一些问题,有的问题比较好解决,有的就找了好久才知道怎么解决的,故记录下来. 环境 系统:wi ...

  2. win8转win7+真正解决 “安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法

    问题情况:win8电脑转win7系统,出现问题:“安装程序无法定位现有系统分区,也无法创建新的系统分区”   第一种:猜测可行的方法: 1.老毛桃U盘启动电脑,进入PE系统后,直接使用Diskgeni ...

  3. c4 L3-001 找零钱 (简单01背包-输出最小字典序解(用vector保存当前最优解))

    #include <iostream> #include <algorithm> #include <vector> #include <cstdio> ...

  4. SQL Server2008 R2命令行启动及停止SQL服务的方法

    ===================================================== 在 SQL Server中,想要启动或停止SQL Server服务,通过SQL Server ...

  5. Oracle plsql乱码

    方法1.执行  set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 方法2.执行--regedit--查找--NLS_LANG--设置值 SIMPLIFIED ...

  6. Linux 性能工具安装部署

    docker 一.运行docker Linux内核版本需要在3.8以上,针对centos6.5 内核为2.6的系统需要先升级内核.不然会特别卡 在yum的ELRepo源中,有mainline(4.5) ...

  7. Oracle 联机重做日志文件(ONLINE LOG FILE)

    --========================================= -- Oracle 联机重做日志文件(ONLINE LOG FILE) --================== ...

  8. react 知识点

    1.react内联样式写法: <div style={{width:'200px',height:'100px',border:'1px solid red'}}> </div> ...

  9. HTTP报头:通用报头,请求报头,响应报头和实体报头

    缓存控制优先级从高到低分别是Pragma -> Cache-Control -> Expires 报头 每一个报头都是由 [名称 + ":" + 空格 + 值 + ] ...

  10. DevExpress GridControl控件行内新增、编辑、删除添加选择框(转)

    http://blog.csdn.net/m1654399928/article/details/21951519 1.首先到GridControl控件设计里设置属性Repository    (In ...