Python:使用节点和弧中的数据构建树

时间:2012-06-19 07:55:24

标签: python tree

我正在尝试使用节点和弧中的数据构建树。到目前为止我所做的是构建类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。所以我认为我实现这种共同结构的方式并不好。有没有一种解决这个问题的标准方法?或者你将如何构建这样的树结构?

提前致谢,

里斯

2 个答案:

答案 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

您无需为节点使用自定义类。您可以简单地使用字符串,整数等(任何可清除对象)。