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) ...
随机推荐
- 安装wordcloud第三方库Unable to find vcvarsall.bat
前言 本来想要使用python爬一些数据的,制作词云,感觉挺好玩的,不过python安装第三方库的时候遇到了一些问题,有的问题比较好解决,有的就找了好久才知道怎么解决的,故记录下来. 环境 系统:wi ...
- win8转win7+真正解决 “安装程序无法定位现有系统分区,也无法创建新的系统分区”的方法
问题情况:win8电脑转win7系统,出现问题:“安装程序无法定位现有系统分区,也无法创建新的系统分区” 第一种:猜测可行的方法: 1.老毛桃U盘启动电脑,进入PE系统后,直接使用Diskgeni ...
- c4 L3-001 找零钱 (简单01背包-输出最小字典序解(用vector保存当前最优解))
#include <iostream> #include <algorithm> #include <vector> #include <cstdio> ...
- SQL Server2008 R2命令行启动及停止SQL服务的方法
===================================================== 在 SQL Server中,想要启动或停止SQL Server服务,通过SQL Server ...
- Oracle plsql乱码
方法1.执行 set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 方法2.执行--regedit--查找--NLS_LANG--设置值 SIMPLIFIED ...
- Linux 性能工具安装部署
docker 一.运行docker Linux内核版本需要在3.8以上,针对centos6.5 内核为2.6的系统需要先升级内核.不然会特别卡 在yum的ELRepo源中,有mainline(4.5) ...
- Oracle 联机重做日志文件(ONLINE LOG FILE)
--========================================= -- Oracle 联机重做日志文件(ONLINE LOG FILE) --================== ...
- react 知识点
1.react内联样式写法: <div style={{width:'200px',height:'100px',border:'1px solid red'}}> </div> ...
- HTTP报头:通用报头,请求报头,响应报头和实体报头
缓存控制优先级从高到低分别是Pragma -> Cache-Control -> Expires 报头 每一个报头都是由 [名称 + ":" + 空格 + 值 + ] ...
- DevExpress GridControl控件行内新增、编辑、删除添加选择框(转)
http://blog.csdn.net/m1654399928/article/details/21951519 1.首先到GridControl控件设计里设置属性Repository (In ...