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)
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.
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.
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.
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'
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>)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With