How can I implement a tree in Python? How can I implement a tree in Python? python python

How can I implement a tree in Python?


I recommend anytree (I am the author).

Example:

from anytree import Node, RenderTreeudo = Node("Udo")marc = Node("Marc", parent=udo)lian = Node("Lian", parent=marc)dan = Node("Dan", parent=udo)jet = Node("Jet", parent=dan)jan = Node("Jan", parent=dan)joe = Node("Joe", parent=dan)print(udo)Node('/Udo')print(joe)Node('/Udo/Dan/Joe')for pre, fill, node in RenderTree(udo):    print("%s%s" % (pre, node.name))Udo├── Marc│   └── Lian└── Dan    ├── Jet    ├── Jan    └── Joeprint(dan.children)(Node('/Udo/Dan/Jet'), Node('/Udo/Dan/Jan'), Node('/Udo/Dan/Joe'))

anytree has also a powerful API with:

  • simple tree creation
  • simple tree modification
  • pre-order tree iteration
  • post-order tree iteration
  • resolve relative and absolute node paths
  • walking from one node to an other.
  • tree rendering (see example above)
  • node attach/detach hookups


Python doesn't have the quite the extensive range of "built-in" data structures as Java does. However, because Python is dynamic, a general tree is easy to create. For example, a binary tree might be:

class Tree:    def __init__(self):        self.left = None        self.right = None        self.data = None

You can use it like this:

root = Tree()root.data = "root"root.left = Tree()root.left.data = "left"root.right = Tree()root.right.data = "right"

If you need an arbitrary number of children per node, then use a list of children:

class Tree:    def __init__(self, data):        self.children = []        self.data = dataleft = Tree("left")middle = Tree("middle")right = Tree("right")root = Tree("root")root.children = [left, middle, right]


A generic tree is a node with zero or more children, each one a proper (tree) node. It isn't the same as a binary tree, they're different data structures, although both shares some terminology.

There isn't any builtin data structure for generic trees in Python, but it's easily implemented with classes.

class Tree(object):    "Generic tree node."    def __init__(self, name='root', children=None):        self.name = name        self.children = []        if children is not None:            for child in children:                self.add_child(child)    def __repr__(self):        return self.name    def add_child(self, node):        assert isinstance(node, Tree)        self.children.append(node)#    *#   /|\#  1 2 +#     / \#    3   4t = Tree('*', [Tree('1'),               Tree('2'),               Tree('+', [Tree('3'),                          Tree('4')])])