Question

Hello all—I'm a programming newcomer, and have the following very simple code here:

def postorder(T):
    if T != None:
        postorder(T.left)
        postorder(T.right)
        print T.data,

All I want is instead of printing the traversal I want to have the function store that information in an array or something of the like such that I can then use that information for other things

Was it helpful?

Solution

You can do:

def postorder(tree):
    data = []

    def recurse(node)
        if not node:
            return
        recurse(node.left)
        recurse(node.right)
        data.append(node.data)

    recurse(tree)
    return data

The inner function recurse takes care of traversing over the tree and the data is automatically added to data.

OTHER TIPS

You could pass in a callable object, or you could write a generator:

def postorder(T):
    if T != None:
        postorder(T.left)
        postorder(T.right)
        print T.data,

def postorder_func(T, f):
    if T != None:
        postorder_func(T.left, f)
        postorder_func(T.right, f)
        f(T.data)

def postorder_gen(T):
    if T != None:
        for i in postorder_gen(T.left):
            yield i
        for i in postorder_gen(T.right):
            yield i
        yield T.data


class T:
    def __init__(self, left = None, data = None, right = None):
        self.left = left
        self.data = data
        self.right = right

one_half = T(data=.5)
three_halves = T(data=1.5)
one = T(one_half, 1, three_halves)
three = T(data=3)
root = T(one, 2, three)

postorder(root)
print ""

a = []
postorder_func(root, a.append)
print a

a = list(postorder_gen(root))
print a

Or, a one-liner solution:

def postorder_one(T):
    return [] if T is None else postorder_one(T.left)+[T.data]+postorder_one(T.right)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top