树的实现
特定的树结构会使得他们更加容易实现 其中最容易实现的就是根的树结构了,这种树的每条边都统根出发,并向下延伸。此类结构所代表的往往是某个数据集拥有所有的层次结构,其根节点代表着全部对象(这些对象获取就被直接包含在叶节点内)而其内部各节点所代表的对象都是以该节点为跟的树结构的叶节点。在这里我们甚至可以直接利用类似直觉,将各个子树组织成一个子树列表
T=[
["a","b"],
["c"],
["d",["e","f"]],
]
T[0][1]
Out[1]:
'b'
In [2]:
T[2][1][0]
Out[2]:
'e'
二叉树的表示
In [3]:
class Tree:
def __init__(self,left,right):
self.left=left;
self.right=right;
In [4]:
t=Tree(Tree("a","b"),Tree("c","d"))
t.right.left
Out[4]:
'c'
2.多路搜索树 第一个引用指向的是当前节点的第一个子节点,而第二个引用所指向的则是其下一个兄弟节点,换句话说,这里的各个节点所应用的是一个兄弟节点链表,并且这些兄弟节点又各自引用数据他们自己的那个兄弟节点链表,这个就是一个多路搜索树
class Tree:
def __init__(self,kids,next=None):
self.kids=self.val=kids
self.next=next
在这里,独立属性val只是为了相关的值提供了一个更具描述性的名称,当然,我们也可以根据自己的意愿对其进行随意调整,下面我们看一下如何实现该结构
t=Tree(Tree("a",Tree("b",Tree("c",Tree("d")))))
t.kids.next.next.val
Out[6]:
'c'
他其实是个链表结构,可以理解成由root->a->b->c->d
3.bunch模式
当树这样的数据结构被原型化时,他往往会使一个非常有用而灵活的类型,允许我们在其构造器中设置任何属性。在这些情况下我们会需要用到一种叫Bunch的设计模式,尽管该模式有许多种实现方式,但基本上他们都会具备以下要素:
class Bunch(dict):
def __init__(self,*args,**kwds):
super(Bunch,self).__init__(*args,**kwds)
self.__dict__=self
该模式主要有几个有用的方面。首先,他能让我们以命令行参数的形式创建相关对象,并设置任何属性
x=Bunch(name="jayne Cobb",position="Public Relations")
x.name
Out[8]:
'jayne Cobb'
其次,由于它继承自dict类,我们可自然而然地获得大量的内容,如对于相关键值/属性值的遍历,或者简单查询一个属性是否存在
In [9]:
T=Bunch
t=T(left=T(left='a',right='b'),right=T(left='c'))
t.left,t.left.right,'left' in t.right
Out[9]:
({'left': 'a', 'right': 'b'}, 'b', True)