前言
二叉树遍历:层序遍历、前序遍历、中序遍历、后序遍历
一、什么是二叉树遍历?
二叉树的遍历是指按照一定顺序访问二叉树中的所有节点。常见的二叉树遍历方式有前序遍历、中序遍历、后序遍历和层序遍历。
二、遍历详解
1.层序遍历
层序遍历是指从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。
节点访问顺序为 [1, 2, 3, 4, 5, 6, 7]
代码如下:
def level_order_traversal(root):
if not root:
return []
result = []
queue = deque([root])
while queue:
level_nodes = []
for _ in range(len(queue)):
node = queue.popleft()
level_nodes.append(node.value)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.append(level_nodes)
return result
代码中使用 队列 实现层序遍历,依次将每一层的节点加入队列,并在处理完当前层的节点后将下一层的节点加入队列,直到队列为空。
每次把队列中最左侧的节点弹出并保存其value。如果该节点有左子节点则将其左子节点添加到队列右侧,右子节点同理。由于层序遍历在每一层按照从左到右的顺序访问节点,所以先判断左子节点,再判断右子节点,这样当队列为空,且当前节点也没有子节点的时候,遍历结束。
2.前序遍历
在前序遍历中,先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。
节点访问顺序为 [1, 2, 4, 5, 3, 6, 7]
代码如下:
def preorder_traversal(self, root):
if root:
# 优先访问根节点
print(root.value, end=" ")
# 对左子节点进行前序遍历
self.preorder_traversal(root.left)
# 对右子节点进行前序遍历
self.preorder_traversal(root.right)
2.中序遍历
中序遍历是指先递归地对左子树进行中序遍历,然后访问根节点,最后递归地对右子树进行中序遍历。
节点访问顺序为 [4, 2, 5, 1, 6, 3, 7]
代码如下:
def inorder_traversal(self, root):
if root:
# 对左子节点进行中序遍历
self.inorder_traversal(root.left)
# 访问根节点
print(root.value, end=" ")
# 对右子节点进行中序遍历
self.inorder_traversal(root.right)
3.后序遍历
后序遍历是指先递归地对左子树进行后序遍历,然后递归地对右子树进行后序遍历,最后访问根节点。
节点访问顺序为 [4, 5, 2, 6, 7, 3, 1]
代码如下:
def postorder_traversal(self, root):
if root:
# 对左子节点进行后序遍历
self.postorder_traversal(root.left)
# 对右子节点进行后序遍历
self.postorder_traversal(root.right)
# 访问根节点
print(root.value, end=" ")
总结
每种遍历方式都有不同的应用场景,可以帮助我们在处理二叉树时更加灵活地操作节点。在实际开发中,根据具体问题的需求,选择合适的遍历方式进行操作。
我是郝尼美,祝你天天心情美