最近要用一个python实现的二叉树,python并没有内置的模块,在网上搜出来的也不够好,那就自己写一个吧。
#!/usr/bin/env python
#coding = utf-8
'''
Author: Yang XU
E-mail: xuy1202@gmail.com
'''
class _Tree(object):
def __init__(self, value, nodeClass):
self.value = nodeClass(value)
self.leftNode = None
self.rightNode = None
def setLeftNode(self, node):
self.leftNode = node
def setRightNode(self, node):
self.rightNode = node
def __str__(self):
returnList = []
returnList.append(self)
index = 0
while index<len(returnList) and returnList[index]:
curNode = returnList[index]
returnList.append(curNode.leftNode)
returnList.append(curNode.rightNode)
index += 1
return str(returnList)
def __repr__(self):
return '<N:%s>'%self.value
def build(sequence, nodeClass=lambda *a: a):
length = len(sequence)
if length:
middle_index = length / 2
value = sequence[middle_index]
_tree = _Tree(value, nodeClass)
_leftnode = build(sequence[:middle_index], nodeClass)
_rightnode = build(sequence[middle_index+1:], nodeClass)
_tree.setLeftNode(_leftnode)
_tree.setRightNode(_rightnode)
else:
_tree = None
return _tree
if __name__ == '__main__':
class d(object):
def __init__(self, value):
self.v = '$%s'%str(value)
def __str__(self):
return self.v
__repr__ = __str__
sequence = range(5)
b = build(sequence)
print b
b = build(sequence, d)
print b
输出结果:
[<N:2>, <N:1>, <N:4>, <N:0>, None, <N:3>, None, None, None]
[<N:$2>, <N:$1>, <N:$4>, <N:$0>, None, <N:$3>, None, None, None]
特点:
1。输入为一个有序的序列,不管具体值是什么,构建过程只负责二叉树的生成,而节点的构造通过开放nodeClass来实现,因此可以实现自己对于节点功能的扩展
2。方便起见,展示方式为广度优先的遍历生成一个堆结构的list,根据下标index就可以知道上下级关系