为什么要使用模拟系统栈
相比于用栈来进行二叉树的非递归遍历实现,用系统栈更加的简单直观,而且对于三种遍历都有着相同的形式
模拟系统栈进行二叉树遍历
将结点赋予一个状态值,0代表输出当前结点,1代表递归处理。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
# 1 表示递归处理
stack = [(1, root)]
res = []
while stack:
command, node = stack.pop()
if command == 0:
# 0 表示当前马上执行将结点的值添加到结果集中
res.append(node.val)
else:
# 关键在这里:因为是模拟系统栈,应该把中序遍历的顺序倒过来写
# 调整一下顺序就可以完成前序遍历和后序遍历
if node.right:
stack.append((1, node.right))
stack.append((0, node))
if node.left:
stack.append((1, node.left))
return res