treap Python实现
# 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实现的更多相关文章
- 【Python】 sort、sorted高级排序技巧
文章转载自:脚本之家 这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Pyth ...
- python 列表排序方法sort、sorted技巧篇
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列. 1)排序基础 简单的升序排序是非常容易的.只需要调用sorte ...
- python sort、sorted高级排序技巧(转)
add by zhj: 没找到原文.可以按多个维度进行排序,而且可以指定他们的排序方向,如果维度都是数字,排序比较容易,用+/-号就可以 指定排序方向.否则,就调用多次sorted进行排序了,而且要按 ...
- 【转载】 python sort、sorted高级排序技巧
这篇文章主要介绍了python sort.sorted高级排序技巧,本文讲解了基础排序.升序和降序.排序的稳定性和复杂排序.cmp函数排序法等内容,需要的朋友可以参考下 Python list内置so ...
- python总结六
1.python中主要存在四种命名方式: object #公用方法 _object #半保护 #被看作是“protect”,意思是只有类对象和子类对象自己能访问到这些 ...
- Treap——堆和二叉树的完美结合,性价比极值的搜索树
大家好,今天和大家聊一个新的数据结构,叫做Treap. Treap本质上也是一颗BST(平衡二叉搜索树),和我们之前介绍的SBT是一样的.但是Treap维持平衡的方法和SBT不太一样,有些许区别,相比 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
随机推荐
- Linux文件系统之Mount流程分析
转载:原文地址http://www.linuxeye.com/linuxrumen/1121.html 本质上,Ext3 mount的过程实际上是inode被替代的过程.例如,/dev/sdb块设备被 ...
- c++跨文件变量声明
常量是内部链接的,可以直接定义; 变量是外部链接,如果在头文件定义的话,如果出现多次引用同一个头文件的编译单元,就会引发multi redifine错误, 这个时候就要只是声明变量来解决:exter ...
- linux中文件上传下载
windows篇 linux文件下载到windows sz命令 登录到linux服务器使用 sz log.log 命令,弹出对话框选择下载文件的目录,点击确定即可. windows文件上传到linux ...
- [HRBUST-1688]数论中的异或(思维题)
数论中的异或 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 75(41 users) Total Accepted: 35(30 us ...
- rabbitmq学习(五):springboot整合rabbitmq
一.Springboot对rabbitmq的支持 springboot提供了对rabbitmq的支持,并且大大简化了rabbitmq的相关配置.在springboot中,框架帮我们将不同的交换机划分出 ...
- 百度地图API 绘制轨迹历史
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 2018-2019-2 20165212《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165212<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo ...
- jsp servlet 进行基于js的用户验证
写这个只是完成使用js文件参数进行用户验证的处理的jsp 版,已经写过 asp.net php nodejs 以及纯js的,现在完善jsp的 使用的技术是比较简单的就是站点应用我们的js脚本,但是是带 ...
- RabbitMQ消息可靠性分析
消息中间件的可靠性是指对消息不丢失的保障程度:而消息中间件的可用性是指无故障运行的时间百分比,通常用几个 9 来衡量.不存在绝对的可靠性只能尽量趋向完美.并且通常可靠性也意味着影响性能和付出更大的成本 ...
- github 改位置
在设置里改位置后,先在本地库上右键"stop track this repo". 然后在在线库重新CLONE.