使用迭代进行二叉树前序和中序遍历


总结比较一下迭代进行二叉树前序和中序遍历时代码的差异。

首先贴上代码:

# 前序遍历
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

while 循环的控制条件

一共有两个,一个是stack不为空,一个是当前访问的节点不为空。 即

while stack or node:

只有当两个都为空时,才表示已经没有需要处理的节点了。

访问节点的位置

不管是前序遍历还是中序遍历,子while循环的目的都是将当前节点的left子节点循环加入栈中,并且“一左到底”。

前序遍历时,在子while循环中,在将node加入栈之前即进行了访问,这样可以确保节点先于它的left子节点被访问到。

中序遍历时,先通过子while循环进行压栈,后续出栈时再进行访问节点,这样可以确保left子节点先于父节点被访问。


原创文章,转载请注明出处,否则拒绝转载!
本文链接:抬头看浏览器地址栏

上篇: IRT模型中的项目信息函数解读
下篇: 链表判定环的入口和相交链表判定交点