再帰を使用せずにプレオーダートラバーサルを理解することはできますが、インオーダートラバーサルに苦労しています。おそらく、再帰の内部動作を理解していないために、私はそれを理解していないようです。
これは私がこれまでに試したことです:
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
内側のwhileループは正しく感じられません。また、一部の要素は2回印刷されています。そのノードが以前に出力されたかどうかを確認することでこれを解決できるかもしれませんが、これには別の変数が必要です。どこが間違っているのですか?
注文後のトラバーサルは試していませんが、似ていると思います。そこでも同じ概念上の障害に直面します。
御時間ありがとうございます!
Lifo
PS:との定義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