data structures – How can I implement a tree in Python?

data structures – How can I implement a tree in Python?

I recommend anytree (I am the author).

Example:

from anytree import Node, RenderTree

udo = 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
    └── Joe

print(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 doesnt 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 = data

left = Tree(left)
middle = Tree(middle)
right = Tree(right)
root = Tree(root)
root.children = [left, middle, right]

data structures – How can I implement a tree in Python?

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

There isnt any builtin data structure for generic trees in Python, but its 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   4
t = Tree(*, [Tree(1),
               Tree(2),
               Tree(+, [Tree(3),
                          Tree(4)])])

Leave a Reply

Your email address will not be published. Required fields are marked *