Recursive Postorder Traversal to List in Python?

10,053

Solution 1

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.

Solution 2

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)
Share:
10,053
Admin
Author by

Admin

Updated on June 16, 2022

Comments

  • Admin
    Admin about 2 years

    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

  • Simeon Visser
    Simeon Visser over 10 years
    And Python 3.3+: yield from postorder_gen(T.left).