返回
前中后序遍历的几种写法与剖析
前端
2023-12-06 18:54:10
前序遍历
前序遍历的顺序是:根结点 -> 左子树 -> 右子树。
前序遍历的递归写法
def preorder_traversal_recursive(root):
if root is None:
return
# 访问根结点
print(root.data)
# 递归遍历左子树
preorder_traversal_recursive(root.left)
# 递归遍历右子树
preorder_traversal_recursive(root.right)
前序遍历的非递归写法
def preorder_traversal_iterative(root):
stack = []
while root or stack:
# 如果根结点不为空,则将其压入栈中
while root:
# 访问根结点
print(root.data)
# 将根结点压入栈中
stack.append(root)
# 将根结点的左子树作为新的根结点
root = root.left
# 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
root = stack.pop()
# 将根结点的右子树作为新的根结点
root = root.right
中序遍历
中序遍历的顺序是:左子树 -> 根结点 -> 右子树。
中序遍历的递归写法
def inorder_traversal_recursive(root):
if root is None:
return
# 递归遍历左子树
inorder_traversal_recursive(root.left)
# 访问根结点
print(root.data)
# 递归遍历右子树
inorder_traversal_recursive(root.right)
中序遍历的非递归写法
def inorder_traversal_iterative(root):
stack = []
while root or stack:
# 如果根结点不为空,则将其压入栈中
while root:
# 将根结点压入栈中
stack.append(root)
# 将根结点的左子树作为新的根结点
root = root.left
# 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
root = stack.pop()
# 访问根结点
print(root.data)
# 将根结点的右子树作为新的根结点
root = root.right
后序遍历
后序遍历的顺序是:左子树 -> 右子树 -> 根结点。
后续遍历的递归写法
def postorder_traversal_recursive(root):
if root is None:
return
# 递归遍历左子树
postorder_traversal_recursive(root.left)
# 递归遍历右子树
postorder_traversal_recursive(root.right)
# 访问根结点
print(root.data)
后序遍历的非递归写法
def postorder_traversal_iterative(root):
stack = []
while root or stack:
# 如果根结点不为空,则将其压入栈中
while root:
# 将根结点压入栈中
stack.append(root)
# 将根结点的右子树作为新的根结点
root = root.right
# 将根结点的左子树作为新的根结点
root = root.left
# 如果根结点为空,则从栈中弹出顶层结点作为新的根结点
root = stack.pop()
# 访问根结点
print(root.data)
总结
前序遍历、中序遍历和后序遍历是三种常见的二叉树遍历方式,每种遍历方式都有其独特的特点和应用场景。通过本文的介绍,希望读者能够对这三种遍历方式有更深入的了解,并能够根据需要选择合适的遍历方式。