栈模拟遍历二叉树前、中、后序
颜色标记法
下面为中序遍历,改变入栈顺序可改变遍历顺序
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = [root]
while stack:
node = stack.pop()
if not node: continue
if isinstance(node, TreeNode):
stack.extend([node.right, node.val, node.left])
else:
res.append(node)
return res
先序遍历
def preorderTraversal(self, node, k):
# write code here
stack = []
res = []
while node or stack:
while node:
stack.append(node)
res.append(node.val)
node = node.left
# 这时候node已经变成None了,所以要把node赋值为数组的最后一个
node = stack.pop()
# 如果node.right为空,那么node赋值为空,进入下一次外层循环的时候就继续弹栈。
# 如果node.right不为空,那么node就赋值为右节点,进入下一次外层循环的时候遍历右子树。
node = node.right
return res
def preorderTraversal(root):
ret = []
if root == None: return ret
stack = []
stack.append(root)
while stack:
node = stack.pop()
ret.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return ret
中序遍历
中序遍历和前序遍历一样,只是把res.append(node.val)
换了个位置,即在深度遍历完左子树之后保存当前节点的值。
def preorderTraversal(self, node, k):
# write code here
stack = []
res = []
while node or stack:
while node:
stack.append(node)
node = node.left
# 这时候node已经变成None了,所以要把node赋值为数组的最后一个
node = stack.pop()
res.append(node.val)
# 如果node.right为空,那么node赋值为空,进入下一次外层循环的时候就继续弹栈。
# 如果node.right不为空,那么node就赋值为右节点,进入下一次外层循环的时候遍历右子树。
node = node.right
return res
后序遍历
相比于前面,多了出栈判定。
后序遍历需要弹栈时需要注意当前节点的右节点是否存在,右节点存在必须保证右节点已经出栈,此时节点出栈(每次出栈保存前一次节点用于判断),反之,进入到右节点。
def traverseWithCallStack(self, node, k):
# write code here
stack = []
res = []
pre = None
while node or stack:
while node:
stack.append(node)
node = node.left
# 这时候node已经变成None了,所以要把node赋值为数组的最后一个
node = stack[-1]
if node.right == None or node.right == pre:
stack.pop()
res.append(node.val)
prev = node
node = None
else:
node = node.right
return res