我能够理解使用非递归方式进行前序遍历,但我对中序遍历感到困难。我似乎无法理解它,也许是因为我还没有理解递归的内部工作原理。
目前我尝试过以下方法:
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循环感觉不太对。此外,一些元素被打印了两次;也许我可以通过检查该节点是否已经被打印来解决这个问题,但这需要另一个变量,这再次让人感觉不对。我哪里出错了?我还没有尝试后序遍历,但我猜它很相似,我在那里也会遇到同样的概念障碍。谢谢你的时间!P.S.:Lifo和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
traverse(node): if node != None do: traverse(node.left) print node.value traverse(node.right) endif
是尾递归的。 - Jackson Tale