我正在尝试使用节点和弧中的数据构建树。到目前为止我所做的是构建类Tree,Arc和Node,如下所示:
class Tree():
def __init__(self):
self.root = None
self.nodes = {}
self.end_arcs = {}
class Arc():
def __init__(self,start,end,data={}):
self.start = start
self.end = end
self.data = data
class Node():
def __init__(self,token,data={}):
self.token = str(token)
self.state = self.OPEN
self.data = data
节点的编号越来越多,端节点标记为-1。但是,当我想要反转树并重新编号节点时,我必须改变很多东西:我的节点的密钥dict,每个节点的标签和可能(或者它们是否可以指向节点中的节点? )我的弧线中的节点也是dict。所以我认为我实现这种共同结构的方式并不好。有没有一种解决这个问题的标准方法?或者你将如何构建这样的树结构?
提前致谢,
里斯
答案 0 :(得分:1)
稍微扩展我的评论,请考虑以下
class Tree():
def __init__(self):
self.root = None
self.nodes = {}
self.end_arcs = {}
class Arc():
def __init__(self,start,end,data={}):
self.start = start
self.end = end
self.data = data
def __str__(self):
return "%s-%s" % (self.start.token, self.end.token)
class Node():
def __init__(self,token,data={}):
self.token = str(token)
#self.state = self.OPEN
self.data = data
n1 = Node(1)
n2 = Node(2)
n3 = Node(3)
n4 = Node(4)
n5 = Node(5)
t = Tree()
t.root = n1
t.nodes = [n1,n2,n3,n4,n5]
a1 = Arc(n1,n2)
a2 = Arc(n2,n3)
a3 = Arc(n2,n4)
a4 = Arc(n1,n5)
print(a1) # 1-2
# "Rename" Nodes
n1.token = 101
n2.token = 102
print(a1) # 101-102
“重命名”节点没有问题,因为弧通过“引用”而不是它的ID来保持节点的轨道。例如,当我们查看弧时,使用引用允许我们不关心底层节点的更改方式。
答案 1 :(得分:0)
除非您想自己实施此图形基础结构,否则请查看NetworkX。它是一个功能完整的图形/网络库,很容易上手。
import networkx as nx
class Node(object):
def __init__(self, data):
self.data = data
G = nx.Graph()
G.add_nodes_from([Node(1), Node(2), Node(3), Node(4)])
G.add_edge(1, 2, data='some data')
G.add_edge(2, 3, data='some more data')
G.add_edge(2, 4, data='yet more data')
这会创建一个看起来像
的图表 1
|
2
/ \
/ \
| |
3 4
您无需为节点使用自定义类。您可以简单地使用字符串,整数等(任何可清除对象)。