# 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.

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. Eclipse之NDK编译-- Type 'jint' could not be resolved, and JNIEnv, jclass错误解决办法

    最近在研究面部识别美白相关的功能.使用的是opencv,就去研究了.今天正好有空就把安装了ndk,安装完成之后就试图去编译demo程序,hellow-jni c代码,一开始编辑就报错了3个错误信息: ...

  2. 【opencv基础】OpenCV从Mat中提取某些行或列

    这两个函数返回的是指向原矩阵内部位置的指针,类似于浅拷贝: code cv::Mat align_mean(cv::Mat mean, cv::Rect facebox, float scaling_ ...

  3. [LeetCode&Python] Problem 136. Single Number

    Given a non-empty array of integers, every element appears twice except for one. Find that single on ...

  4. 8个iPhone防盗秘籍 为手机和资料安全保驾护航

    最近发现用x手机的朋友越来越多,今天一个朋友手机被偷,万分焦急,失财事小,电话里很多手机号码等重要信息都无法找回.为了让大家尽量安全使用自己的iPhone或苹果产品,哪怕丢失后也有最大的可能性找回,特 ...

  5. Omar Loves Candies

    题目大意:在一个N * M的格子中,放有一些糖,这些糖有的会损害健康,有的对健康有益.有损害的被记为负数,有益的会记为正数.另外,对于每一个糖而言,他都比左边的糖和上面的糖更健康. 现在我要在在N*M ...

  6. sql 变量赋值

    mysql 的变量赋值如下: set @name='app' ; or set @name:='appfirst'; or with select select @appname:='you name ...

  7. sql server insert values 多值 与oracle 的不同

    类似的语句在 oracle 中是不能执行的 insert into temp_tbl values('app'),('demo'); 但是在sql server 中是可以的 insert into c ...

  8. oracel SQL多表查询优化

    SQL优化 1.执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就 ...

  9. Spark的启动进程详解

    Master和Worker是执行任务之前存在的进程 (类似于公司) Driver和Excutor是任务执行之后存在的进程(类似于公司接到项目后才成立的项目小组) 启动步骤: 启动Master资源管理进 ...

  10. RAC 修改 spfile 参数

    我们知道数据库的参数文件有spfile 和pfile. RAC 的参数文件比较特殊. 因为默认情况下,RAC的spfile 是放在共享设备上(RAW设备或者ASM磁盘组).而在各节点的pfile文件里 ...