二叉树递归遍历的代码实现是非常简单的,所以很多时候考察一个人代码能力的时候会让写一个二叉树的非递归遍历。三种实现如下:
先序遍历
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
def preorder(root):
res = []
if not root:
return res
stack = [root]
while stack:
treeNode = stack.pop()
res.append(treeNode.val)
if treeNode.right:
stack.append(treeNode.right)
if treeNode.left:
staack.append(treeNode.left)
return res
后序遍历
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
def postorder(root):
res = []
if not root:
return res
stack = [root]
while stack:
treeNode = stack.pop()
if treeNode.left:
stack.append(treeNode.left)
if treeNode.right:
stack.append(treeNode.right)
res.append(treeNode.val)
return res[::-1]
中序遍历
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
def inorder(root):
res = []
if not root:
return res
cur = root
stack = []
while stack or cur:
while cur:
stack.append(cur)
cur = cur.left
treeNode = stack.pop()
res.append(treeNode.val)
cur = treeNode.right
return res
二叉树的递归遍历是很易懂的,而递归就是把函数返回值不断压栈,最后到达递归出口。非递归遍历算法就是用一个显式的栈模拟这个过程,这里一定要注意压栈的顺序,因为栈是后进先出的,要明确跟遍历规则的对应,尤其要注意的是后序遍历,因为最后返回的结果列表是取反了的。