【编程题】【leetcode145】打印二叉树(非递归)

递归法打印二叉树是极其简单的

而非递归的方式呢?

要求非递归的实现二叉树的打印时,要用到栈来实现迭代

 

一、先序:根左右;

二、中序:左根右;

三、后序:左右根;

 

一、先序:根左右:入栈顺序为右左-出栈时每pop一个,就把他的右左入栈

 1 # 先序打印二叉树(非递归)
 2 def preOrderTravese(node):
 3    stack = [node]
 4     while len(stack) > 0:
 5         print(node.val)
 6        if node.right is not None:
 7            stack.append(node.right)
 8         if node.left is not None:
 9            stack.append(node.left)
10         node = stack.pop()

二、中序:左根右:入栈顺序为根左左左-出栈时每pop一个,就继续处理当前pop元素的right

 1 # 中序打印二叉树(非递归)
 2 def inOrderTraverse(node):
 3    stack = []
 4    pos = node
 5    while pos is not None or len(stack) > 0:
 6         if pos is not None:
 7             stack.append(pos)
 8             pos = pos.left
 9        else:
10             pos = stack.pop()
11             print(pos.val)根
12             pos = pos.right 右

三、后序:左右根

Method 1 # 根右左反向 空间复杂度为O(n) n为节点个数 ->【若面试要求空间复杂度为树的深度则采取method2】
        if not root:
            return []
        stack = [root]
        result = []
        while len(stack) > 0:
            node = stack.pop()
            result.append(node.val)
            if node.left:
                stack.append(node.left)
            if node.right:
                stack.append(node.right)
        return result[::-1]
Method 2 # 利用一个栈和一个标志节点实现后序遍历 空间复杂度为O(logn)

def bin_tree_post_order_traverse4(root):
    s=[]
    s.append(root)
    lastNode=None #上一个访问过(打印出来)的节点
    while s:
        while s[-1].lchild: # 使用while到达其分支最底层的左节点
            s.append(s[-1].lchild)
        while s:
            # 如果当前节点的右节点为空或者已经访问过时,此时当前节点已经遍历完成,出栈,并打印
            if s[-1].rchild==lastNode or not s[-1].rchild:
                node=s.pop()
                print(node.value)
                lastNode=node
            elif s[-1].rchild: #如果当前节点的右节点没有访问过,则当前节点入栈
                s.append(s[-1].rchild)
                break 
                #当前节点入栈后,需要首先遍历其左节点,因此break,使用while到达其分支最底层的左节点

---------------------

原文:https://blog.csdn.net/u012435142/article/details/89062177

参考:https://www.cnblogs.com/icekx/p/9127569.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值