Python中最简单的树数据结构,可以在两个方向轻松遍历

时间:2017-01-20 10:03:27

标签: python data-structures

我需要最简单的数据结构实现,可以在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...

这样做安全吗? (循环引用可能会影响垃圾收集?)这样做有意义吗?什么会更简单?

2 个答案:

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

其余的取决于您的需求。你可能想要在你的类中内置的一些函数(或者如果你使用哈希,在脚本中构建为方法)

  • 更新:它采用特定节点并更新其值/名称/内容 有你
  • 删除:获取特定节点并将其从树中删除。如果 这样做确保将已删除的节点子节点连接到
    删除节点parent。
  • 插入:获取树中的特定点并添加新节点 进去。这应该更新节点周围的父节点和子节点。
  • 更新子项:将子项附加到node.child数组。应该 从更新父级调用,因为这两个进程是自引用的。
  • 更新父级:从parent.child数组中删除self。添加自我 new_parent.child数组。

如果要轻松引用节点的特定部分,可以将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 

如果需要,上面的内容可让您轻松浏览特定节点。

顺便说一句,删除树或哈希映射中引用的节点会使垃圾收集成为非问题。