Hilf mir, Inorder Traversal ohne Rekursion zu verstehen

Ich bin in der Lage zu verstehen, preorder traversal ohne Verwendung von Rekursion, aber ich habe eine harte Zeit mit inorder traversal. Ich weiß einfach nicht scheinen, um es zu bekommen, vielleicht, weil ich noch nicht verstanden, die innere Arbeitsweise einer Rekursion.

Dies ist, was ich bisher ausprobiert habe:

def traverseInorder(node):
    lifo = Lifo()
    lifo.push(node)
    while True:
        if node is None:
            break
        if node.left is not None:
            lifo.push(node.left)
            node = node.left
            continue
        prev = node
        while True:
            if node is None:
                break
            print node.value
            prev = node
            node = lifo.pop()
        node = prev
        if node.right is not None:
            lifo.push(node.right)
            node = node.right
        else:
            break

Den inneren while-Schleifen fühlt sich einfach nicht richtig. Auch, einige der Elemente sind immer zweimal gedruckt; vielleicht kann ich dies lösen, indem man prüft, ob dieser Knoten hat schon gedruckt vor, aber das erfordert eine andere variable, die wiederum fühlt sich nicht richtig an. Wo mache ich falsch?

Ich habe nicht versucht, postorder-Traversierung, aber ich denke, es ist ähnlich und ich werde mit den gleichen konzeptionellen Blockade auch da.

Vielen Dank für Ihre Zeit!

P. S.: Definitionen von Lifo und Node:

class Node:
    def __init__(self, value, left=None, right=None):
        self.value = value
        self.left = left
        self.right = right

class Lifo:
    def __init__(self):
        self.lifo = ()
    def push(self, data):
        self.lifo = (data, self.lifo)
    def pop(self):
        if len(self.lifo) == 0:
            return None
        ret, self.lifo = self.lifo
        return ret

InformationsquelleAutor der Frage Srikanth | 2010-01-22

Schreibe einen Kommentar