python中的二叉树模块内容:
BinaryTree:非平衡二叉树
AVLTree:平衡的AVL树
RBTree:平衡的红黑树
以上是用python写的,相面的模块是用c写的,并且可以做为Cython的包。
FastBinaryTree
FastAVLTree
FastRBTree
特别需要说明的是:树往往要比python内置的dict类慢一些,但是它中的所有数据都是按照某个关键词进行排序的,故在某些情况下是必须使用的。
安装和使用
安装方法
安装环境:
ubuntu12.04, python 2.7.6
安装方法
下载源码,地址:https://bitbucket.org/mozman/bintrees/src
进入源码目录,看到setup.py文件,在该目录内运行
python setup.py install
安装成功,ok!下面就看如何使用了。
应用
bintrees提供了丰富的API,涵盖了通常的多种应用。下面逐条说明其应用。
- 引用
如果按照一般模块的思路,输入下面的命令引入上述模块
> import bintrees
错了,这是错的,出现如下警告:(×××不可用,用×××)
Warning: FastBinaryTree not available, using Python version BinaryTree. Warning: FastAVLTree not available, using Python version AVLTree. Warning: FastRBTree not available, using Python version RBTree.
正确的引入方式是:
> from bintrees import BinaryTree #只引入了BinartTree > from bintrees import * #三个模块都引入了
- 实例化
看例子:
> btree = BinaryTree() > btree BinaryTree({}) > type(btree) <class 'bintrees.bintree.BinaryTree'>
- 逐个增加键值对: .__setitem__(k,v) .复杂度O(log(n))(后续说明中,都会有复杂度标示,为了简单,直接标明:O(log(n)).)
看例子:
> btree.__setitem__("Tom","headmaster") > btree BinaryTree({'Tom': 'headmaster'}) > btree.__setitem__("blog","http://blog.csdn.net/qiwsir") > btree BinaryTree({'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
- 批量添加: .update(E) E是dict/iterable,将E批量更新入btree. O(E*log(n))
看例子:
> adict = [(2,"phone"),(5,"tea"),(9,"scree"),(7,"computer")] > btree.update(adict) > btree BinaryTree({2: 'phone', 5: 'tea', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
- 查找某个key是否存在: .__contains__(k) 如果含有键k,则返回True,否则返回False. O(log(n))
看例子:
> btree BinaryTree({2: 'phone', 5: 'tea', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'}) > btree.__contains__(5) True > btree.__contains__("blog") True > btree.__contains__("qiwsir") False > btree.__contains__(1) False
- 根据key删除某个key-value: .__delitem__(key), O(log(n))
看例子:
> btree BinaryTree({2: 'phone', 5: 'tea', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'}) > btree.__delitem__(5) #删除key=5的key-value,即:5:'tea' 被删除. > btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
- 根据key值得到该kye的value: .__getitem__(key)
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'}) > btree.__getitem__("blog") 'http://blog.csdn.net/qiwsir' > btree.__getitem__(7) 'computer' > btree._getitem__(5) #在btree中没有key=5,于是报错。 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'BinaryTree' object has no attribute '_getitem__'
- 迭代器: .__iter__()
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'}) > aiter = btree.__iter__() > aiter <generator object <genexpr> at 0xb7416dec> > aiter.next() #注意:next()一个之后,该值从list中删除 2 > aiter.next() 7 > list(aiter) [9, 'Tom', 'blog'] > list(aiter) #结果是空 [] > bool(aiter) #but,is True True
- 树的数据长度: .__len__(),返回btree的长度。O(1)
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'}) > btree.__len__() 5
- 找出key最大的k-v对: .__max__(),按照key排列,返回key最大的键值对。
- 找出key最小的键值对: .__min__()
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) > btree.__max__() (9, 'scree') > btree.__min__() (2, 'phone')
- 两棵树的关系运算
看例子:
> other = [(3,'https://www.jb51.net'),(7,'qiwsir')] > bother = BinaryTree() #再建一个树 > bother.update(other) #加入数据 > bother BinaryTree({3: 'https://www.jb51.net', 7: 'qiwsir'}) > btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) > btree.__and__(bother) #重叠部分部分 BinaryTree({7: 'computer'}) > btree.__or__(bother) #全部 BinaryTree({2: 'phone', 3: 'https://www.jb51.net, 7: 'computer', 9: 'scree'}) > btree.__sub__(bother) #btree不与bother重叠的部分 BinaryTree({2: 'phone', 9: 'scree'}) > btree.__xor__(bother) #两者非重叠部分 BinaryTree({2: 'phone', 3: 'https://www.jb51.net, 9: 'scree'})
- 输出字符串模样,注意仅仅是输出的模样罢了: .__repr__()
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) > btree.__repr__() "BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})"
- 清空树中的所有数据 :.clear(),O(log(n))
看例子:
> bother BinaryTree({3: 'http://blog.csdn.net/qiwsir', 7: 'qiwsir'}) > bother.clear() > bother BinaryTree({}) > bool(bother) False
- 浅拷贝: .copy(),官方文档上说是浅拷贝,但是我做了操作实现,是下面所示,还不是很理解其“浅”的含义。O(n*log(n))
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) > ctree = btree.copy() > ctree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) > btree.__setitem__("github","qiwsir") #增加btree的数据 > btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > ctree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'}) #这是不是在说明属于深拷贝呢? > ctree.__delitem__(7) #删除ctree的一个数据 > ctree BinaryTree({2: 'phone', 9: 'scree'}) > btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'})
- 移除树中的一个数据: .discard(key),这个功能与.__delitem__(key)类似.两者都不反悔值。O(log(n))
看例子:
> ctree BinaryTree({2: 'phone', 9: 'scree'}) > ctree.discard(2) #删除后,不返回值,或者返回None > ctree BinaryTree({9: 'scree'}) > ctree.discard(2) #如果删除的key不存在,也返回None > ctree.discard(3) > ctree.__delitem__(3) #但是,.__delitem__(key)则不同,如果key不存在,会报错。 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/bintrees/abctree.py", line 264, in __delitem__ self.remove(key) File "/usr/local/lib/python2.7/site-packages/bintrees/bintree.py", line 124, in remove raise KeyError(str(key)) KeyError: '3'
- 根据key查找,并返回或返回备用值: .get(key[,d])。如果key在树中存在,则返回value,否则如果有d,则返回d值。O(log(n))
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > btree.get(2,"algorithm") 'phone' > btree.get("python","algorithm") #没有key='python'的值,返回'algorithm' 'algorithm' > btree.get("python") #如果不指定第二个参数,若查不到,则返回None >
- 判断树是否为空: is_empty().根据树数据的长度,如果数据长度为0,则为空。O(1)
看例子:
> ctree BinaryTree({9: 'scree'}) > ctree.clear() #清空数据 > ctree BinaryTree({}) > ctree.is_empty() True > btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > btree.is_empty() False
- 根据key、value循环从树中取值:
.items([reverse])--按照(key,value)结构取值;
.keys([reverse])--key
.values([reverse])--value. O(n)
.iter_items(s,e[,reverse]--s,e是key的范围,也就是生成在某个范围内的key的迭代器 O(n)
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > for (k,v) in btree.items(): ... print k,v ... 2 phone 7 computer 9 scree github qiwsir > for k in btree.keys(): ... print k ... 2 7 9 github > for v in btree.values(): ... print v ... phone computer scree qiwsir > for (k,v) in btree.items(reverse=True): #反序 ... print k,v ... github qiwsir 9 scree 7 computer 2 phone > btree BinaryTree({2: 'phone', 5: None, 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'}) > for (k,v) in btree.iter_items(6,9): #要求迭代6<=key<9的键值对数据 ... print k,v ... 7 computer 8 eight >
- 删除数据并返回该值:
.pop(key[,d]), 根据key删除树的数据,并返回该value,但是如果没有,并也指定了备选返回的d,则返回d,如果没有d,则报错;
.pop_item(),在树中随机选择(key,value)删除,并返回。
看例子:
> ctree = btree.copy() > ctree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > ctree.pop(2) #删除key=2的数据,返回其value 'phone' > ctree.pop(2) #删除一个不存在的key,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/bintrees/abctree.py", line 350, in pop value = self.get_value(key) File "/usr/local/lib/python2.7/site-packages/bintrees/abctree.py", line 557, in get_value raise KeyError(str(key)) KeyError: '2' > ctree.pop_item() #随机返回一个(key,value),并已删除之 (7, 'computer') > ctree BinaryTree({9: 'scree', 'github': 'qiwsir'}) > ctree.pop(7,"sing") #如果没有,可以返回指定值 'sing'
- 查找数据,并返回value: .set_default(key[,d]),在树的数据中查找key,如果存在,则返回该value。如果不存在,当指定了d,则将该(key,d)添加到树内;当不指定d的时候,添加(key,None). O(log(n))
看例子:
> btree BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'}) > btree.set_default(7) #存在则返回 'computer' > btree.set_default(8,"eight") #不存在,则返回后备指定值,并加入到树 'eight' > btree BinaryTree({2: 'phone', 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'}) > btree.set_default(5) #如果不指定值,则会加入None > btree BinaryTree({2: 'phone', 5: None, 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'}) > btree.get(2) #注意,.get(key)与.set_default(key[,d])的区别 'phone' > btree.get(3,"mobile") #不存在的 key,返回但不增加到树 'mobile' > btree BinaryTree({2: 'phone', 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'})
- 根据key删除值
.remove(key),删除(key,value)
.remove_items(keys),keys是一个key组成的list,逐个删除树中的对应数据
看例子:
> ctree BinaryTree({2: 'phone', 5: None, 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'}) > ctree.remove_items([5,6]) #key=6,不存在,报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/site-packages/bintrees/abctree.py", line 271, in remove_items self.remove(key) File "/usr/local/lib/python2.7/site-packages/bintrees/bintree.py", line 124, in remove raise KeyError(str(key)) KeyError: '6' > ctree BinaryTree({2: 'phone', 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'}) > ctree.remove_items([2,7,'github']) #按照 列表中顺序逐个删除 > ctree BinaryTree({8: 'eight', 9: 'scree'})
##以上只是入门的基本方法啦,还有更多内容,请移不到到文章开头的官方网站
Python,二叉树
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]