小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
我们在上一篇实现了递归版本的二叉树遍历,点击这里去看递归版本,今天我们来讲解一下非递归版本的实现。 我们首先回忆一下题目要求。
问题描述
给定一个二叉树,分别按照二叉树的先序、中序和后序打印所有节点。
要求:空间复杂度是O(n),时间复杂度是O(n)。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [[1,2,3],[1,3,2],[3,2,1]]
非递归实现
下面我们来看一下代码如何实现。
from pyarabic.stack import Stack
def inorder(root):
res=[]
stack=Stack()
while root or stack:
while root:
stack.push(root)
root=root.left
root=stack.pop()
res.append(root.val)
root=root.right
return res
同理,先序遍历和后序遍历也可以使用非递归的方式实现。
下面,我们采用非递归的方式来实现本题的需求。
class Solution:
def threeOrders(self, root):
result = []
result.append(self.preorder(root))
result.append(self.inorder(root))
result.append(self.postorder(root))
return result
def postorder(self, root):
res = []
if not root:
return res
stack = []
prev = None
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
if not root.right or root.right == prev:
##root.right == prev 用来判断右孩子是否已经访问过了
res.append(root.val)
prev = root
root = None
else:
stack.append(root)
root = root.right
return res
def preorder(self, root):
res = []
if not root:
return res
stack = []
while stack or root:
while root:
res.append(root.val)
stack.append(root)
root=root.left
root = stack.pop()
root = root.right
return res
def inorder(self, root):
res = []
stack = []
while root or stack:
while root:
stack.append(root)
root = root.left
root = stack.pop()
res.append(root.val)
root = root.right
return res