总结比较一下迭代进行二叉树前序和中序遍历时代码的差异。
首先贴上代码:
# 前序遍历
preorderList = list()
stack = list()
node = root
while node or stack:
while node:
preorderList.append(node)
stack.append(node)
node = node.left
node = stack.pop()
node = node.right
#****************************************
# 中序遍历
inorderList = list()
stack = list()
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
inorderList.append(node)
node = node.right
一共有两个,一个是stack不为空,一个是当前访问的节点不为空。 即
while stack or node:
只有当两个都为空时,才表示已经没有需要处理的节点了。
不管是前序遍历还是中序遍历,子while循环的目的都是将当前节点的left子节点循环加入栈中,并且“一左到底”。
前序遍历时,在子while循环中,在将node加入栈之前即进行了访问,这样可以确保节点先于它的left子节点被访问到。
中序遍历时,先通过子while循环进行压栈,后续出栈时再进行访问节点,这样可以确保left子节点先于父节点被访问。