递归法打印二叉树是极其简单的
而非递归的方式呢?
要求非递归的实现二叉树的打印时,要用到栈来实现迭代
一、先序:根左右;
二、中序:左根右;
三、后序:左右根;
一、先序:根左右:入栈顺序为右左-出栈时每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.youkuaiyun.com/u012435142/article/details/89062177
参考:https://www.cnblogs.com/icekx/p/9127569.html