Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Printing a Tree data structure in Python

Tags:

I was looking for a possible implementation of tree printing, which prints the tree in a user-friendly way, and not as an instance of object.

I came across this solution on the net:

source: http://cbio.ufs.ac.za/live_docs/nbn_tut/trees.html

class node(object):     def __init__(self, value, children = []):         self.value = value         self.children = children      def __repr__(self, level=0):         ret = "\t"*level+repr(self.value)+"\n"         for child in self.children:             ret += child.__repr__(level+1)         return ret 

This code prints the tree in the following way:

'grandmother'     'daughter'         'granddaughter'         'grandson'     'son'         'granddaughter'         'grandson' 

Is it possible to have the same result but without changing the __repr__ method, because I am using it for another purpose.

EDIT:

Solution without modifying __repr__ and __str__

def other_name(self, level=0):     print '\t' * level + repr(self.value)     for child in self.children:         child.other_name(level+1) 
like image 447
Kristof Pal Avatar asked Nov 27 '13 12:11

Kristof Pal


People also ask

How do you print tree structure in Python?

To insert into a tree we use the same node class created above and add a insert class to it. The insert class compares the value of the node to the parent node and decides to add it as a left node or a right node. Finally the PrintTree class is used to print the tree.

Is there a tree data structure in Python?

Python TreeNode classA TreeNode is a data structure that represents one entry of a tree, which is composed of multiple of such nodes. The topmost node of a tree is called the “root”, and each node (with the exception of the root node) is associated with one parent node.

How do you print a binary tree?

You start traversing from the root, then go to the left node, then you again go to the left node until you reach a leaf node. At that point in time, you print the value of the node or mark it as visited and move to the right subtree. Continue the same algorithm until all nodes of the binary tree are visited.


2 Answers

Yes, move the __repr__ code to __str__, then call str() on your tree or pass it to the print statement. Remember to use __str__ in the recursive calls too:

class node(object):     def __init__(self, value, children = []):         self.value = value         self.children = children      def __str__(self, level=0):         ret = "\t"*level+repr(self.value)+"\n"         for child in self.children:             ret += child.__str__(level+1)         return ret      def __repr__(self):         return '<tree node representation>' 

Demo:

>>> root = node('grandmother') >>> root.children = [node('daughter'), node('son')] >>> root.children[0].children = [node('granddaughter'), node('grandson')] >>> root.children[1].children = [node('granddaughter'), node('grandson')] >>> root <tree node representation> >>> str(root) "'grandmother'\n\t'daughter'\n\t\t'granddaughter'\n\t\t'grandson'\n\t'son'\n\t\t'granddaughter'\n\t\t'grandson'\n" >>> print root 'grandmother'     'daughter'         'granddaughter'         'grandson'     'son'         'granddaughter'         'grandson' 
like image 74
Martijn Pieters Avatar answered Oct 12 '22 15:10

Martijn Pieters


Why don't you store it as a treelib object and print it out similar to how we print the CHAID tree out here with more relevant node descriptions related to your use case?

([], {0: 809, 1: 500}, (sex, p=1.47145310169e-81, chi=365.886947811, groups=[['female'], ['male']])) ├── (['female'], {0: 127, 1: 339}, (embarked, p=9.17624191599e-07, chi=24.0936494474, groups=[['C', '<missing>'], ['Q', 'S']])) │   ├── (['C', '<missing>'], {0: 11, 1: 104}, <Invalid Chaid Split>) │   └── (['Q', 'S'], {0: 116, 1: 235}, <Invalid Chaid Split>) └── (['male'], {0: 682, 1: 161}, (embarked, p=5.017855245e-05, chi=16.4413525404, groups=[['C'], ['Q', 'S']]))     ├── (['C'], {0: 109, 1: 48}, <Invalid Chaid Split>)     └── (['Q', 'S'], {0: 573, 1: 113}, <Invalid Chaid Split>) 
like image 42
Rambatino Avatar answered Oct 12 '22 15:10

Rambatino