# 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. magento首页点击任何产品都出现404错误的问题方法

    很简单,只要在其他项目上的根目录上复制一个.htaccess文件到项目跟目录下就可以 了,其实就是是设置伪静态:

  2. DS18B20配置

    复位脉冲: 先拉低至少480us,以产生复位脉冲,接着释放4.7k电阻为高,延时15~60us, 进入接收. void DS18B20_Rst(void) { DS18B20_IO_OUT(); // ...

  3. windows7所有版本迅雷地址下载集合(含32位和64位) - imsoft.cnblogs

    Windows7 SP1旗舰版 32位官方原版下载: ed2k://|file|/cn_windows_7_ultimate_with_sp1_x86_dvd_618763.iso|265187737 ...

  4. uva1482:Playing With Stones (SG函数)

    题意:有N堆石子,每次可以取一堆的不超过半数的石子,没有可取的为输. 思路:假设只有一堆,手推出来,数量x可以表示为2^p-1形式的必输. 但是没什么用,因为最后要的不是0和1,而是SG函数:所以必输 ...

  5. TP3.2整合kindeditor

    HTML   <!-- KE图片上传 --> <link rel="stylesheet" href="__PUBLIC__/kindeditor/th ...

  6. elasticsearch问题解决之分片副本UNASSIGNED

    在上一篇文章中,我记录了在windows下同一台机器上搭建es集群的步骤,第二天在向集群中创建索引的时候,出现了分片副本未分配的情况(UNASSIGNED). 虽然并不影响数据的插入和查询,但是有问题 ...

  7. ppt正文排版

  8. test20180902 day1

    试题限制均为256MB,1Sec 总分:250 试题一 谜题 首先请解以下谜题:车下的数字是什么? 正确的答案是 87 .这道题对小龙大犇来说太轻松了,于是他想加强难度来考考你:对于给定的长度 N,能 ...

  9. PDFSharp生成PDF (转)

    http://www.cnblogs.com/zhouxin/p/3228108.html 在上面用OpenXML生成word后,原来利用Word2010里的导出成PDF功能就不能用. 然后找开源组件 ...

  10. 【Android界面实现】AppWidght全面学习之电量监控小部件的实现具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/bz419927089/article/details/35791047 前几天翻看之前下载的各种资料 ...