我需要最简单的数据结构实现,可以在parent-> children和children-> parent方向中遍历;所以理想情况下,孩子也应该提到父母的参考。
正在考虑一本字典,孩子们只需要提及他们的父母,类似于:
# define the root node
a = {'name': 'trunk', 'value': 0, 'parent': None, 'children': []}
# add child
a['children'].append({'name': 'branch-1', 'value': 1,
'parent': a, 'children': []})
# and so on...
这样做安全吗? (循环引用可能会影响垃圾收集?)这样做有意义吗?什么会更简单?
答案 0 :(得分:4)
一个简单的Tree(Node)类,可以双向遍历:
class Tree(object):
def __init__(self, data, children=None, parent=None):
self.data = data
self.children = children or []
self.parent = parent
def add_child(self, data):
new_child = Tree(data, parent=self)
self.children.append(new_child)
return new_child
def is_root(self):
return self.parent is None
def is_leaf(self):
return not self.children
def __str__(self):
if self.is_leaf():
return str(self.data)
return '{data} [{children}]'.format(data=self.data, children=', '.join(map(str, self.children)))
> t = Tree('foo')
> bar = t.add_child('bar')
> baz = t.add_child('baz')
> print(t)
'foo [bar, baz]'
> print(bar.parent)
'foo [bar, baz]'
答案 1 :(得分:1)
您将创建一个Node类。
基本结构看起来像这样,但老实说,你也可以用dicts来做。只是个人认为课程看起来更干净。
class Node(object):
def __init__(self):
self.parent = None # Single object
self.child = [] # Array of objects
self.name = None
self.data = None
其余的取决于您的需求。你可能想要在你的类中内置的一些函数(或者如果你使用哈希,在脚本中构建为方法)
如果要轻松引用节点的特定部分,可以将hash_map作为一种目录
node_tree_map = {}
node_tree_map[node.name] = node
# node_tree_map['name'] would allow you quick access to bob's
# parent/children/value
# just by knowing the name but without having to traverse
# the whole tree to find it
如果需要,上面的内容可让您轻松浏览特定节点。
顺便说一句,删除树或哈希映射中引用的节点会使垃圾收集成为非问题。