# 前序遍历-迭代-LC144_二叉树的前序遍历
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
# 根结点为空则返回空列表if not root:
return[]
stack =[root]
result =[]while stack:
node= stack.pop()# 中结点先处理
result.append(node.val)# 右孩子先入栈if node.right:
stack.append(node.right)# 左孩子后入栈if node.left:
stack.append(node.left)return result
2. 中序遍历
# 中序遍历-迭代-LC94_二叉树的中序遍历
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return[]
stack =[]# 不能提前将root结点加入stack中
result =[]
cur = root
while cur or stack:
# 先迭代访问最底层的左子树结点if cur:
stack.append(cur)
cur = cur.left
# 到达最左结点后处理栈顶结点
else:
cur = stack.pop()
result.append(cur.val)# 取栈顶元素右结点
cur = cur.right
return result
3. 后序遍历
# 后序遍历-迭代-LC145_二叉树的后序遍历
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return[]
stack =[root]
result =[]while stack:
node= stack.pop()# 中结点先处理
result.append(node.val)# 左孩子先入栈if node.left:
stack.append(node.left)# 右孩子后入栈if node.right:
stack.append(node.right)# 将最终的数组翻转return result[::-1]
二. 实现二叉树迭代遍历方法2(推荐,前中后序遍历统一写法)
1. 前序遍历
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
result =[]st=[]if root:
st.append(root)while st:
node= st.pop()ifnode!= None:
if node.right: #右
st.append(node.right)if node.left: #左
st.append(node.left)
st.append(node)#中
st.append(None)
else:
node= st.pop()
result.append(node.val)return result
2. 中序遍历
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
result =[]
st =[]if root:
st.append(root)while st:
node= st.pop()ifnode!= None:
if node.right: #添加右节点(空节点不入栈)
st.append(node.right)
st.append(node)#添加中节点
st.append(None)#中节点访问过,但是还没有处理,加入空节点做为标记。if node.left: #添加左节点(空节点不入栈)
st.append(node.left)
else: #只有遇到空节点的时候,才将下一个节点放进结果集node= st.pop()#重新取出栈中元素
result.append(node.val)#加入到结果集return result
3. 后序遍历
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
result =[]
st =[]if root:
st.append(root)while st:
node= st.pop()ifnode!= None:
st.append(node)#中
st.append(None)if node.right: #右
st.append(node.right)if node.left: #左
st.append(node.left)
else:
node= st.pop()
result.append(node.val)return result