Python中的二叉树查找算法模块使用指南


Posted in Python onJuly 04, 2014

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://3water.com'),(7,'qiwsir')]
 >>> bother = BinaryTree()  #再建一个树
 >>> bother.update(other) #加入数据

 >>> bother
 BinaryTree({3: 'https://3water.com', 7: 'qiwsir'})
 >>> btree
 BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})
 
 >>> btree.__and__(bother)  #重叠部分部分
 BinaryTree({7: 'computer'})

 >>> btree.__or__(bother) #全部
 BinaryTree({2: 'phone', 3: 'https://3water.com, 7: 'computer', 9: 'scree'})

 >>> btree.__sub__(bother)  #btree不与bother重叠的部分
 BinaryTree({2: 'phone', 9: 'scree'})
 
 >>> btree.__xor__(bother)  #两者非重叠部分
 BinaryTree({2: 'phone', 3: 'https://3water.com, 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 相关文章推荐
在Python中操作字符串之rstrip()方法的使用
May 19 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
Python找出最小的K个数实例代码
Jan 04 Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 Python
Python File(文件) 方法整理
Feb 18 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
python实现kmp算法的实例代码
Apr 03 Python
python安装numpy和pandas的方法步骤
May 27 Python
python zip,lambda,map函数代码实例
Apr 04 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 #Python
python之import机制详解
Jul 03 #Python
Python之eval()函数危险性浅析
Jul 03 #Python
python的绘图工具matplotlib使用实例
Jul 03 #Python
python绘图库Matplotlib的安装
Jul 03 #Python
Python实现全局变量的两个解决方法
Jul 03 #Python
Python实现端口复用实例代码
Jul 03 #Python
You might like
php注入实例
2006/10/09 PHP
网站当前的在线人数
2006/10/09 PHP
用PHP+MySql编写聊天室
2006/10/09 PHP
实用函数2
2007/11/08 PHP
php 将excel导入mysql
2009/11/09 PHP
删除html标签得到纯文本可处理嵌套的标签
2014/04/28 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Django Rest framework认证组件详细用法
2019/07/25 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
python 如何调用 dubbo 接口
2020/09/24 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
中科软笔试题和面试题
2014/10/07 面试题
书法培训心得体会
2014/01/05 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
销售员岗位职责
2015/02/10 职场文书
Django基础CBV装饰器和中间件
2022/03/22 Python