Davtho1983
Davtho1983

Reputation: 3954

Add list as child of tree with python 3

I have looked at many very similar questions and cannot figure it out so:

I have a string like this:

{121{12}12{211}2}

I want to read the string into a tree like this:

Tree diagram

I am confused as how to tell python to add a whole list as a child node?

I would also like to know how to change the current node to the parent of the old current node?

Here is my code so far:

class Node:
    def __init__(self,val):
        self.value = val
        self.children = []
        #init Node class so we can pass in values as nodes and set children to empty list

    def add_child(self, obj):
        self.children.append(obj)

s=[]

for i in filedata:
    if i == leftbrace:
        n = Node(i)
    #create new child of current node
    s = []
    #reset list s to blank

if i == rightbrace:
    n.add_child(s)
    #add list s to current node
    #make parent of current node the new current node

else:
    s.append(i)
    #add i to list s

for c in n.children:
    print (c.data)

Upvotes: 1

Views: 1070

Answers (1)

Stephen Rauch
Stephen Rauch

Reputation: 49774

To make something like this work, it is easiest if you use recursion. Here is one way that this can be done.

Code:

class Node:
    def __init__(self, stream):
        val = []
        children = []
        while True:
            try:
                # get the next character from the stream
                ch = next(stream)

                # if this is an open brace, then recurse to a child
                if ch == '{':
                    children.append(Node(stream))

                # if this is a close brace, we are done on this level
                elif ch == '}':
                    break

                # otherwise add this character to our value
                else:
                    val.append(ch)

            # stream is empty, we are done
            except StopIteration:
                break

        self.value = ''.join(val)
        self.children = children

    @classmethod
    def from_string(cls, string):
        stream = iter(string)
        tree_top = Node(stream)

        # assert that the string started with '{' and was one top node
        assert len(tree_top.children) == 1 and tree_top.value == ''
        return tree_top.children[0]

    def __str__(self):
        return self.value

    def __repr__(self):
        return "Node('%s', <%d children>)" % (
            self.value, len(self.children))

    def tree_string(self, level=0):
        yield '-' + "  " * level + str(self)
        for child in self.children:
            for child_string in child.tree_string(level+1):
                yield child_string

tree = '{121{12}12{211}2}'
for line in Node.from_string(tree).tree_string():
    print(line)

Results:

-121122
-  12
-  211

Upvotes: 1

Related Questions