📅  最后修改于: 2023-12-03 14:54:56.332000             🧑  作者: Mango
树遍历是一种遍历树结构的方式,将树的每个节点都访问一次,且仅访问一次。树遍历算法可以分为三种基本类型:前序遍历、中序遍历和后序遍历。
前序遍历算法是从根节点开始访问,按照“根节点-左子树-右子树”的顺序访问每个节点,具体步骤如下:
前序遍历的结果可以用递归或非递归的方式获得,其中递归的算法比较简单:
def pre_order_traversal(tree):
if tree is not None:
print(tree.value)
pre_order_traversal(tree.left)
pre_order_traversal(tree.right)
非递归的算法需要利用栈结构,具体步骤如下:
非递归的算法如下:
def pre_order_traversal(tree):
stack = []
stack.append(tree)
while stack:
cur_node = stack.pop()
print(cur_node.value)
if cur_node.right is not None:
stack.append(cur_node.right)
if cur_node.left is not None:
stack.append(cur_node.left)
中序遍历算法是按照“左子树-根节点-右子树”的顺序遍历每个节点,具体步骤如下:
中序遍历的结果也可以用递归或非递归的方式获得,其中递归的算法如下:
def in_order_traversal(tree):
if tree is not None:
in_order_traversal(tree.left)
print(tree.value)
in_order_traversal(tree.right)
非递归的算法需要利用栈结构,具体步骤如下:
非递归的算法如下:
def in_order_traversal(tree):
stack = []
cur_node = tree
while cur_node or stack:
while cur_node:
stack.append(cur_node)
cur_node = cur_node.left
cur_node = stack.pop()
print(cur_node.value)
cur_node = cur_node.right
后序遍历算法是按照“左子树-右子树-根节点”的顺序遍历每个节点,具体步骤如下:
后序遍历的结果也可以用递归或非递归的方式获得,其中递归的算法如下:
def post_order_traversal(tree):
if tree is not None:
post_order_traversal(tree.left)
post_order_traversal(tree.right)
print(tree.value)
非递归的算法比较复杂,需要利用栈结构和一个标记变量,具体步骤如下:
非递归的算法如下:
def post_order_traversal(tree):
stack = [(tree, False)]
while stack:
cur_node, visited = stack.pop()
if cur_node:
if visited:
print(cur_node.value)
else:
stack.append((cur_node, True))
stack.append((cur_node.right, False))
stack.append((cur_node.left, False))
树遍历是一种重要的算法,适用于树的遍历、搜索、构建和转化等场景。前序遍历、中序遍历和后序遍历是树遍历的基本类型,掌握这三种遍历算法并能正确运用,可以有效提高程序员的算法水平。