# 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. OpenCV-bwLabel-实现图像连通组件标记与分析

    OpenCV实现图像连通组件标记与分析- matlab bwLabel; code: #include <opencv2/opencv.hpp> #include <iostream ...

  2. XINU安装程序.exe一键配置好XINU实验环境 - imsoft.cnblogs

      还在一步一步配置复杂的XINU吗?XINU安装程序.exe一键配置好XINU实验环境. XINU安装程序.exe使用说明: 本程序配合<网络协议分析与实现>/(胡维华等编著)课本使用 ...

  3. 怎样取消老毛桃软件赞助商---只需在输入框中输入老毛桃官网网址“laomaotao.org”

    来源:www.laomaotao.org 时间:2015-01-29 在众多网友和赞助商的支持下,迄今为止,老毛桃u盘启动盘制作工具已经推出了多个版本.如果有用户希望取消显示老毛桃软件中的赞助商,那不 ...

  4. 如何在Struts2的拦截器中调用Spring容器

    第一种: 通常用ApplicationContext来调用Spring配置文件中的一些Bean,所以首先创建Spring上下文容器. ApplicationContext ac = (Applicat ...

  5. ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)

    2125: A + B 普拉斯 时间限制: 1 Sec  内存限制: 128 MB 提交: 94  解决: 28 [提交] [状态] [讨论版] [命题人:admin] 题目描述 "别人总说 ...

  6. JQuery实时监控文本框字符变化

    $(function(){ $('input[name="addr"]').on('input propertychange', function() { if ($('input ...

  7. css文字和背景色渐变色

    定义一个div: <div class="shop-title" >上海迪士尼度假区官方旗舰店</div> 使用css: .shop-title{ widt ...

  8. Flask, Tornado, GEvent组合运行与性能比较

    我在选一个python的互联网框架, 本来已经定下来用Tornado了.  但我还听到很多人推荐Flask的简单性和灵活性, 还有gevent的高性能, 所以决定也试试它们以及它们和Tornado的结 ...

  9. (领悟)第一个servlet

    //这个代码不可以写在javase的project文件里面//要写在动态web工程里面,不需要配置文件,不需要jsp,只需jar包的帮助(url跳转的必须是java-web文件) import jav ...

  10. nyoj 三个水杯

    三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...