面试常考算法题补充

二叉树先序遍历的非递归实现:

def preOrder(root):
    if not root:
        return
    stack = [root] # 初始化一个栈 用于代替递归调用的系统栈
    while stack:
        node = stack.pop()
        print(node.val)
     # 因为要先遍历左子树 所以要先将右子树入栈 先进后出!   
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)

二叉树中序遍历的非递归实现:

def inOrder(root):
    if not root:
        return
    stack = []
    while root or stack:
        while root:        # 第一次遍历 将当前结点的左子树全部放入栈中,直到左子树为空
            stack.append(root)
            root = root.left
        root = stack.pop() # 第二次遍历
        print(root.val)
        root = root.right  # 每弹出一个节点都要查看当前结点的右子树

二叉树后序遍历的非递归实现:

def postOrder(root):
    if not root:
        return
    stack1 = [root]
    stack2 = []
    # 逆后序遍历
    while stack1:
        node = stack1.pop()
        if node.left:
            stack1.append(node.left)
        if node.right:
            stack1.append(node.right)
        stack2.append(node)
    while stack2:
        print(stack2.pop().val)

 

你可能感兴趣的:(数据结构与算法)