I’ve posted before about creating a tree in Python, but I like this implementation better. It uses a nested class to represent the nodes of the tree, and an interesting construction (line 11) that is a result of that nested class. Also, I do a simple pre-order traversal. I’ll flesh this guy out in later posts.
class Tree: class Node: def __init__( self, data ): self.parent = None self.data = data self.children = [] def addChild( self, data ): # I've actually never used this # construction in a class before! node = Tree.Node( data ) node.parent = self self.children.append( node ) def getChild( self, data ): for child in self.children: if child.data == data: return child return None def countAllChildren( self ): """ pre-order traversal to count all of the children below this node """ # for this node, get a count # of the immediate children count = len( self.children ) for child in self.children: # then call this method for each child # and increment the total count in the # scope of this node count += child.countAllChildren() # then return that count return count def __repr__( self ): return self.data def __len__( self ): return self.countAllChildren() def __init__( self, data ): self.root = self.Node( data )
And some (sort of) tests this time!
t = Tree("/") t.root.addChild("usr/") t.root.addChild("bin/") t.root.getChild("usr/").addChild("local/") assert t.root.parent == None assert len( t.root.children ) == 2 assert t.root.getChild("usr/").parent == t.root assert len( t.root.getChild("usr/").children ) == 1 assert t.root.countAllChildren() == 3 assert len( t.root ) == 3