二叉树遍历【层序遍历、前中后序遍历】

本文详细介绍了二叉树的层序、前序、中序和后序遍历过程,包括遍历顺序和对应的代码实现。这些遍历方式在处理二叉树时具有重要应用价值,根据需求选择适合的方法是关键。


前言

二叉树遍历:层序遍历、前序遍历、中序遍历、后序遍历


一、什么是二叉树遍历?

二叉树的遍历是指按照一定顺序访问二叉树中的所有节点。常见的二叉树遍历方式有前序遍历、中序遍历、后序遍历和层序遍历。

二、遍历详解

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=" ")

总结

每种遍历方式都有不同的应用场景,可以帮助我们在处理二叉树时更加灵活地操作节点。在实际开发中,根据具体问题的需求,选择合适的遍历方式进行操作。

我是郝尼美,祝你天天心情美

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值